Hibernate criteria query on different properties of different objects

匿名 (未验证) 提交于 2019-12-03 02:45:02

问题:

Suppose I have classes like:

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

and I want to filter criteria on A, two filters on different subclass properties, like:

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)); 

What I want to do is combine criteriaB and criteriaC using an "or" clause, something like:

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

How can I accomplish this? I am stumbling a little over the API here.

回答1:

Use aliases instead of nested criteria:

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"))  ); 


回答2:

You only need to create one criteria object like so.

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


回答3:

In case someone else finds it useful, I found a more complicated answer to the problem which appears to be allowed by the API, though I did not get to test it before ChssPly posted his (simpler) solution:

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)); 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!