JPA Transient属性一起使用Hibernate Criteria API

时间:2018-05-29 14:16:09

标签: java hibernate hibernate-criteria transient

是否可以将@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

1 个答案:

答案 0 :(得分:0)

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

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

这个也会失败,因为start在该表中没有列。你需要为此做一个工作。在不知道用例的情况下,很难想出一个好的解决方法。最容易的就是在表格中加入start,但我猜你有理由不立即加入