如何重写 FetchType.EAGER 以在运行时惰性

问题描述 投票:0回答:3

使用 JPA EntityManager 和 JPA Query 对象,如何重写具有注释 @OneToMany(fetch = FetchType.EAGER) 的内容以在查询中延迟获取?

如果我有 hibernate Query 对象,我可以让它创建一个条件对象并使用它,将获取类型设置为惰性。但我必须使用 JPA 查询对象。这个问题有解决办法吗?

java hibernate jpa persistence
3个回答
8
投票

即使使用本机 Hibernate API 也无法做到这一点。如果关联被定义为 EAGER,它将始终被急切加载,并且无法使用查询来更改它。

反之则不然:您可以使用查询急切地加载惰性关联。


0
投票

自 Hibernate 5.4.22 起,已接受的答案不再正确(请参阅HHH-8776)。现在可以通过提供

EAGER
查询提示来动态控制
javax.persistence.fetchgraph
属性的获取类型。

假设您有一个

Query
(或
TypedQuery
),您可以通过提供空实体图来有效地将所有关联设置为惰性:

EntityGraph<Child> entityGraph = entityManager.createEntityGraph(Child.class);
query.setHint("javax.persistence.fetchgraph", entityGraph);
List<Child> children = query.getResultList();

或者您可以通过调用来准确指定要急切获取哪些属性

entityGraph.addAttributeNodes("parent");

-1
投票

查看 Hibernate Fetch 配置文件或 JPA 实体图。自从您在 2012 年提出这个问题以来,这个问题已经解决了。

© www.soinside.com 2019 - 2024. All rights reserved.