Hibernate在一个查询中使用父实体连接子列表

时间:2016-09-09 13:56:46

标签: java hibernate

所以我在这两个表之间有一个ManyToOne关系:

@Entity
public class Parent{
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @OneToMany(cascade = CascadeType.ALL, mappedBy="parent", orphanRemoval=true)
    @OrderBy(clause="id DESC")
    private List<Children> childs= new ArrayList<Children>();
}

@Entity
public class Children{
        @Id 
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int id;

        @ManyToOne
        private Parent parent;

}

所以我想做的是在一个查询中得到包含它的孩子的List<Parent>,我的意思是我不想使用延迟加载,所以我想把孩子加入到父母的一个查询并获取父母列表 如何使用hibernate的Criteria或HQL实现这一目标? 我使用过这个查询,但它没有给我我想要的东西:

List<Parent> list = session.createQuery("SELECT p FROM Parent p JOIN p.childs c ORDER BY p.id DESC").list();

这给了我List<Parent>但当我循环通过它时,当父母有多个孩子时,我得到重复的父母!!

2 个答案:

答案 0 :(得分:0)

您不必显式使用hibernate-criteria(通常用于编写自定义查询),您可以使用GenericRepositoryHibernate中的标准OOTB方法。

需要注意的是,您创建的父bean必须具有child类型的子属性(而不是string或int)。你已经完成了。这种映射很难绑定。

基本上这就是全部。如果您遇到一些问题 - 提供日志片段和放大器解释问题本身。

答案 1 :(得分:0)

尝试加入FETCH

List<Parent> list = session.createQuery("SELECT p FROM Parent p JOIN FETCH p.childs c ORDER BY p.id DESC").list();