【问题标题】:Hibernate - how to fetch properties for list of objects in one queryHibernate - 如何在一个查询中获取对象列表的属性
【发布时间】:2012-01-20 10:14:18
【问题描述】:

我有 Persistent 类,指的是许多具有 LAZY 提取类型的集合,例如

@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 类实例,而是修改已经存在的对象)

【问题讨论】:

    标签: java hibernate grails lazy-loading


    【解决方案1】:

    来自the reference manual

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

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

    【讨论】:

    • 据我了解,这将创建新的对象集合,但我的目标是修改现有对象
    • Hibernate 仅在其缓存中保留给定实体的一个实例。如果您查询已加载到缓存中的实体,则查询将返回这些实体。除了他们的集合将通过查询初始化。
    【解决方案2】:

    您应该使用泛型映射 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
    

    假设您正在使用休眠模板来获取数据:

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

    【讨论】:

    • 不,这不是一个有效的 HQL 查询。即使是,您也无法分辨哪个列表属于哪个表,也无法返回 List
    • 这是有效的 HQL 查询。当然在这个例子中它不会起作用,因为 user1160344 提供的类是无效的。你是对的 List 在这里是错误的。当 list2 被正确映射为 List 类型的属性时,结果应该是 List
    • 谢谢,但在我的情况下不是这样:主要目标是修改现有对象,而不是使用获取的集合创建新对象
    • 在我的情况下,您不再获取 Table 对象,而只获取来自 list2 属性的对象。
    • 对不起。我刚刚检查过,它确实是有效的 HQL。不过,它不是有效的 JPQL。
    猜你喜欢
    • 2022-01-25
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 2012-01-22
    • 1970-01-01
    相关资源
    最近更新 更多