有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

假设我有这样的课程:

class A {
 B getB();
 C getC();
}

class B {
 String getFoo();
}

class C {
 int getBar();
}

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

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组合起来,类似于:

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

我怎样才能做到这一点?我在这里对API有点结巴


共 (3) 个答案

  1. # 1 楼答案

    如果其他人认为它有用,我找到了一个更复杂的问题答案,这似乎是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));
    
  2. # 2 楼答案

    您只需要像这样创建一个criteria对象

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

    使用aliases代替嵌套条件:

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