1
我创建了一个名为Person的实体。它实现了生命周期界面。 onLoad方法设置部门属性。有时候一个部门是未知的(== null)。hibernate - Criteria查询的虚拟列
@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
}
}
有什么办法可以使部门属性成为一个虚拟列(或类似的东西) - 从未在数据库中创建。
@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 = session.createCriteria(Person.class);
criteria.add(Restrictions.isNotNull("department"));
List<Person> list = criteria.list();
我知道Criteria在找到部门之前执行,所以属性'department'无法解析。
我已经看到了,我可以从用户类型的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);
}
}
但@Formula表达式只能使用其他属性,对吧?我不能使用任何自定义代码? – 2012-07-25 08:19:51
@Formula表达式是一个将在SQL select子句中使用的SQL表达式。如果您可以将其放入SQL select子句中以检索其他虚拟列,则可以将其放入公式中。 – 2012-07-25 08:45:51
好的,但部门属性的解决不基于任何数据库表,因此不可能创建公式。 – 2012-07-26 07:16:10