可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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));