2012-07-25 30 views
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); 
    } 
} 

回答

0

这是可能的,如果你能表达虚拟列的内容作为SQL配方,采用@Formula注解。有关更多详细信息,请参阅the documentation。如果虚拟列是虚拟连接列,那么您也可以使用@JoinFormula annotation

+0

但@Formula表达式只能使用其他属性,对吧?我不能使用任何自定义代码? – 2012-07-25 08:19:51

+0

@Formula表达式是一个将在SQL select子句中使用的SQL表达式。如果您可以将其放入SQL select子句中以检索其他虚拟列,则可以将其放入公式中。 – 2012-07-25 08:45:51

+0

好的,但部门属性的解决不基于任何数据库表,因此不可能创建公式。 – 2012-07-26 07:16:10