使用 JPA EntityManager 和 JPA Query 对象,如何重写具有注释 @OneToMany(fetch = FetchType.EAGER) 的内容以在查询中延迟获取?
如果我有 hibernate Query 对象,我可以让它创建一个条件对象并使用它,将获取类型设置为惰性。但我必须使用 JPA 查询对象。这个问题有解决办法吗?
即使使用本机 Hibernate API 也无法做到这一点。如果关联被定义为 EAGER,它将始终被急切加载,并且无法使用查询来更改它。
反之则不然:您可以使用查询急切地加载惰性关联。
自 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");
查看 Hibernate Fetch 配置文件或 JPA 实体图。自从您在 2012 年提出这个问题以来,这个问题已经解决了。