【问题标题】:JPA Transient property together Hibernate Criteria APIJPA Transient 属性一起 Hibernate Criteria API
【发布时间】:2018-05-29 14:16:08
【问题描述】:

是否可以将@PostLoad 与 Hibernate Criteria API 一起使用?例如:

@Entity
public class EntityExample {

  private Integer startYear;

  private Integer startPeriod;

  @Transient
  private String start;

  @PostLoad
  private void init() {
    this.start = this.startYear.toString() + this.startPeriod.toString();
  }

  public String getStart() {
    return this.start;
  }
} 

public class DAOExample {

  public Collection<EntityExample> get(String start) {
    Session session = getSession();
    Criteria criteria = session.createCriteria(EntityExample.class, "entity");
    criteria.add(Restrictions.ne("entity.start", start));
    return criteria.list();
  }
}

当我将 @Formula 与 Hibernate Criteria 一起使用时(例如:@Formula(value = "start_year::text || start_period::text")),它可以正常工作。但是我正在尝试使用@PostLoad,因为如果需要重构任何涉及的属性,则无需记住手动更改公式的value。但是,使用@PostLoad 会导致:org.hibernate.QueryException: could not resolve property: start of: com.entity.EntityExample

【问题讨论】:

    标签: java hibernate hibernate-criteria transient


    【解决方案1】:

    @Transient 将属性标记为未包含在数据库表中。现在您使用Criteria API 创建一个包含它的查询。这等于以下查询:

    select * from EntityExample where start != 'start value'
    

    这个也会失败,因为start 不是该表中的列。您将需要为此做一些解决方法。在不了解用例的情况下,很难想出一个好的解决方法。最简单的方法是将start 包含在表格中,但我想您有理由不立即包含它

    【讨论】:

      猜你喜欢
      • 2013-09-20
      • 2013-06-21
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      • 2011-10-17
      • 1970-01-01
      • 2012-04-09
      • 2016-09-02
      相关资源
      最近更新 更多