如何在hibernate中查询父/子

时间:2014-09-06 20:25:06

标签: java hibernate

我有以下父/子示例

public class Parent implements Serializable{
    private Integer parentId;
    private Set<Child> childs = new HashSet<Child>();

    public Parent(){}

    // getters and setters
}

public class Child implements Serializable{
    private Integer childId;
    private Parent parent;

    public Child(){}

    // getters and setters
}

XML文件:

<hibernate-mapping package="com.dto">
    <class name="Parent" table="Parent">
        <id name="idParent" type="int" column="idParent">
            <generator class="increment"/>
        </id>
        <set name="childs" table="Childs" inverse="true" cascade="save-update">
            <key column="idParent" not-null="true"/>
            <one-to-many class="Child"/>
        </set>
    </class>
</hibernate-mapping>

<hibernate-mapping package="com.dto">
    <class name="Child" table="Childs">
        <id name="idChild" type="int" column="idChild">
            <generator class="increment"/>
        </id>
        <many-to-one name="parent" class="Parent" column="idParent" not-null="true"/>
    </class>
</hibernate-mapping>

问题是如果我运行此查询:

ArrayList<Parent> parents = (ArrayList<Parent>) session.createQuery("from Parent p").list();

我得到了这个:[父],这是我想要的结果,但是如果我运行这个查询:

 ArrayList<Parent> parents = (ArrayList<Parent>) session.createQuery("from Parent p 
                                           inner join p.childs c 
                                           where parent.someField = someValue and 
                                           c.someField = someValue").list();

我得到了这个:[[父母,孩子]]我希望得到这样的结果:[父母]

我怎样才能得到我想要的结果?

1 个答案:

答案 0 :(得分:0)

使用select子句(在JPQL,BTW中是必需的):

select p from Parent p ...

另外,请不要假设查询返回ArrayList。它返回一个List,这就是你需要知道的全部内容:

List<Parent> parents = session.createQuery("...").list();

最后,由于您似乎从Hibernate开始并且没有维护一个已有10年历史的代码库,因此您应该使用注释而不是XML来映射您的实体。它们是标准的,更安全,更简洁。当Java处于版本4时,XML很酷。它现在是版本8.