Hibernate - 如何在一个查询中获取对象列表的属性

时间:2012-01-20 10:14:19

标签: java hibernate grails lazy-loading

我有Persistent类,指的是许多带有LAZY fetch类型的集合,比如

@Entity
@Table(name = "TABLE")
public class Table implements Serializable {
    ....


    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "LIST1", nullable = true)
    private ArrayList list1;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "LIST2", nullable = true)
    private ArrayList list2;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "LIST1", nullable = true)
    private ArrayList list1;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "LIST2", nullable = true)
    private ArrayList list2;

....

}

我已经通过Hibernate实例化了一些TABLE类型的对象,将它添加到了一个表列表中,现在想要为这个列表中的所有对象获取这个集合中的一个(比如list2)。

for(Table table:tables){
     result=table.list2;
     ....
}

但是这样Hibernate会生成一系列单独的SQL查询。可以在一个查询中对集合中的所有对象进行hibernate提取list2吗? (重要的是不要创建新的Table类实例,而是修改已经存在的对象)

2 个答案:

答案 0 :(得分:1)

来自the reference manual

  

“fetch”连接允许值的关联或集合   使用单个选择与其父对象一起初始化。   这在集合的情况下特别有用。它   有效地覆盖了外连接和延迟声明   关联和集合的映射文件。

select t from Table t
left join fetch t.list2
where ...

答案 1 :(得分:0)

您应该使用泛型映射list2属性。让我们说:

@Entity
@Table(name = "TABLE")
public class Table implements Serializable {
    ....


    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "LIST1", nullable = true)
    private List<OtherClass> list1;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "LIST2", nullable = true)
    private List<OtherClass> list2;
}

HQL查询:

select list2 from Table

因此,假设您正在使用hibernate模板来获取数据:

List<OtherClass> result = getHibernateTemplate().find("select list2 from Table");