首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Hibernate标准查询不同对象的不同属性

Hibernate标准查询不同对象的不同属性
EN

Stack Overflow用户
提问于 2009-10-06 22:05:14
回答 3查看 19.9K关注 0票数 16

假设我有这样的类:

代码语言:javascript
复制
class A {
 B getB();
 C getC();
}

class B {
 String getFoo();
}

class C {
 int getBar();
}

我想在A上过滤条件,在不同的子类属性上过滤两个过滤器,比如:

代码语言:javascript
复制
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));

我想要做的是使用"or“子句组合criteriaB和criteriaC,类似于:

代码语言:javascript
复制
//this does not work
criteriaA.add(Restrictions.disjunction().add(criteriaB).add(criteriaC));

我如何才能做到这一点呢?我在这里遇到了一点API问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-10-06 22:12:58

使用aliases而不是嵌套条件:

代码语言:javascript
复制
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"))
 );
票数 25
EN

Stack Overflow用户

发布于 2009-10-06 22:16:27

您只需要创建一个criteria对象,如下所示。

代码语言:javascript
复制
Criteria criteria = session.createCriteria(A.class);
criteria.add(Restriction.disjunction()
    .add(Restriction.eq("b.foo", "something"))
    .add(Restriction.eq("c.bar", 0)));
票数 4
EN

Stack Overflow用户

发布于 2009-10-06 22:43:34

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

代码语言:javascript
复制
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));
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1528352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档