Java Hibernate条件:如果实体的任何子实体具有特定属性,则查找实体
我需要编写一个标准或hql来通过子实体的子实体的属性来查找父实体。以下是我的实体:Java Hibernate条件:如果实体的任何子实体具有特定属性,则查找实体,java,hibernate,hql,criteria,Java,Hibernate,Hql,Criteria,我需要编写一个标准或hql来通过子实体的子实体的属性来查找父实体。以下是我的实体: // The top level parent class public class A { private Long id; private String someProperty; private B b; // and some other attributes... } // The second level parent class :) public class B
// The top level parent class
public class A {
private Long id;
private String someProperty;
private B b;
// and some other attributes...
}
// The second level parent class :)
public class B {
private Long id;
private List<C> cList;
// and some other attributes...
}
public class C {
private Long id;
private B b;
private List<D> dList;
// Other attributes..
}
public class D {
private Long id;
private C c;
private String importantAttribute;
// Other attributes..
}
然后我就放弃了。如果使用HQL,类似这样的方法应该会奏效: 你需要一个私人房间;在B类中定义的链接。试试这个
Criteria criteria = getSession().createCriteria(A.class, "a");
criteria.createAlias("a.b", "b");
criteria.createAlias("b.cList", "c");
criteria.createAlias("c.dList", "d");
criteria.add(Restrictions.eq("a.someProperty", "somethingelse");
criteria.add(Restrictions.eq("d.importantAttribute", "something");
谢谢,这对我有用。我不确定它是否正常工作,但至少它返回了一些结果:我想我需要进行更多的测试。如果没有针对a.b找到对象或列表,那么它甚至不会返回父对象。@ZahidKhan您可以在createAlias方法中作为第三个参数传递。@PredFragmaric方法不推荐使用cr.createAliasa.b,ab,CriteriaSpecification.LEFT_JOIN;hibernate 4.1。@ZahidKhan你是对的,但是有一个替换方法。使用cr.createAliasa.b、ab、JoinType.LEFT\u OUTER\u JOIN。我无法在b类中添加字段。
TypedQuery<A> query = em
.createQuery(
"SELECT a FROM D d join fetch d.c c join fetch c.b b join fetch b.a a where a.someProperty = :someProperty and d. importantAttribute = :importantAttribute",
A.class);
query.setParameter("someProperty", "somethingelse");
query.setParameter("importantAttribute", "something");
List<A> results = query.getResultList();
Criteria criteria = getSession().createCriteria(A.class, "a");
criteria.createAlias("a.b", "b");
criteria.createAlias("b.cList", "c");
criteria.createAlias("c.dList", "d");
criteria.add(Restrictions.eq("a.someProperty", "somethingelse");
criteria.add(Restrictions.eq("d.importantAttribute", "something");