简体   繁体   English

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

[英]Hibernate criteria query on different properties of different objects

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: 我想在A上过滤标准,在不同的子类属性上有两个过滤器,例如:

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: 我想要做的是使用“或”子句组合criteriaB和criteriaC,如:

//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. 我在这里绊倒了一些API。

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

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

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: 如果其他人发现它有用,我发现了一个更复杂的问题答案,这似乎是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));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM