hibernate - Criteria查询的虚拟列

时间:2012-07-25 07:52:14

标签: hibernate hibernate-mapping hibernate-criteria usertype

我创建了一个名为Person的实体。它实现了Lifecycle接口。 onLoad方法设置department属性。有时部门是未知的(== null)。

@Entity
@Table(name = "PERSON")
public class Person implements Lifecycle {

   @Column(name = "NAME", length = 128, columnDefinition = "VARCHAR2(128)")
   String name;

   @Transient
   Department department;

   public void onLoad(Session s, Serializable id) {
      // some logic resolving department
   }
}

有没有办法让department属性成为虚拟列(或类似的东西) - 从未在数据库中创建。

@Entity
@Table(name = "PERSON")
public class Person {

   @Column(name = "NAME", length = 128, columnDefinition = "VARCHAR2(128)")
   String name;

   @Type(type = "DepartmentType") // UserType for resolving a department
   //@Transcient
   //@Column(insertable = false, updatable = false)
   //@NotFound(action = NotFoundAction.IGNORE)
   // ... don't have a clue
   Department department;
}

我希望能够使用Criteria。

Criteria criteria = session.createCriteria(Person.class);
criteria.add(Restrictions.isNotNull("department"));
List<Person> list = criteria.list();

我了解Criteria在找到部门之前执行,因此无法解析财产“部门”。

我已经看到我可以从UserType的nullSafeGet

中删除一行
public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner) throws HibernateException, SQLException {
   rs.deleteRow();
}

但我不想删除数据库中的行(它是只读的!)。

总结我的问题是:

1)是否可以创建虚拟列?

2)有没有更有效的方法呢?

Criteria criteria = session.createCriteria(Person.class);
// ... some restrictions ...
List<Person> list = criteria.list();
Iterator<EbamLogMessageEntity> it = list.iterator();
while(it.hasNext()) {
    Person p = it.next();
    Department d = resolveDepartment(p)
    if(d == null) {
    it.remove();
} else {
        p.setDepartment(d);
    }
}

1 个答案:

答案 0 :(得分:0)

如果您可以使用@Formula注释将虚拟列的内容表达为SQL公式,则可能。有关详细信息,请参阅the documentation。如果虚拟列是虚拟连接列,您还可以使用@JoinFormula annotation