代码之家  ›  专栏  ›  技术社区  ›  RMorrisey

休眠条件查询不同对象的不同属性

  •  16
  • RMorrisey  · 技术社区  · 15 年前

    假设我有这样的课程:

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

    我想在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));
    

    我要做的是使用“or”子句将criteriab和criteriac结合起来,比如:

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

    我怎样才能做到这一点?我对这里的API有点犹豫不决。

    3 回复  |  直到 11 年前
        1
  •  24
  •   ChssPly76    15 年前

    使用 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"))
     );
    
        2
  •  4
  •   mR_fr0g    15 年前

    您只需要创建一个这样的条件对象。

    Criteria criteria = session.createCriteria(A.class);
    criteria.add(Restriction.disjunction()
        .add(Restriction.eq("b.foo", "something"))
        .add(Restriction.eq("c.bar", 0)));
    
        3
  •  3
  •   RMorrisey    15 年前

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