Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate条件:如果实体的任何子实体具有特定属性,则查找实体_Java_Hibernate_Hql_Criteria - Fatal编程技术网

Java Hibernate条件:如果实体的任何子实体具有特定属性,则查找实体

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

我需要编写一个标准或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 {
    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");