Hibernate条件查询不同对象的不同属性

假设我有以下课程:

class A { B getB(); C getC(); } class B { String getFoo(); } class C { int getBar(); } 

我想在A上过滤标准,在不同的子类属性上有两个filter,例如:

 Criteria criteriaA = session.createCriteria(A.class); Criteria criteriaB = criteriaA.createCriteria("b").add(Restrictions.eq("foo", "Something")); Criteria criteriaC = criteriaA.createCriteria("c").add(Restrictions.eq("bar", 0)); 

我想要做的是使用“或”子句组合criteriaB和criteriaC,如:

 //this does not work criteriaA.add(Restrictions.disjunction().add(criteriaB).add(criteriaC)); 

我怎么能做到这一点? 我在这里绊倒了一些API。

使用别名而不是嵌套条件:

 Criteria criteria = session.createCriteria(A.class) .createAlias("b", "b_alias") .createAlias("c", "c_alias") .add(Restrictions.disjunction() .add(Restrictions.eq("b_alias.foo", "Something")) .add(Restrictions.eq("c_alias.bar", "0")) ); 

您只需要创建一个标准对象,就像这样。

 Criteria criteria = session.createCriteria(A.class); criteria.add(Restriction.disjunction() .add(Restriction.eq("b.foo", "something")) .add(Restriction.eq("c.bar", 0))); 

如果其他人发现它有用,我发现了API似乎允许的问题的更复杂的答案,尽管我没有在ChssPly发布他的(更简单的)解决方案之前测试它:

 DetachedCriteria bValues = DetachedCriteria.forClass(A.class); bValues.createCriteria("b").add(Restrictions.eq("foo", "something")); DetachedCriteria cValues = DetachedCriteria.forClass(A.class); cValues.createCriteria("c").add(Restrictions.eq("bar", 0)); Restrictions.or(Subqueries.in("id", bValues), Subqueries.in("id", cValues));