如何强制JPA(eclipselink)使用联接而不是独立查询?

时间:2012-08-02 04:29:22

标签: jpa eclipselink

我在我的项目中使用JPA 2(eclipselink提供程序),我遇到以下问题:

当我执行以下代码时:

em.createQuery("select t from " + entityName  + " t where t.id = ?1"
).setParameter(1, id)
.setHint(QueryHints.REFRESH, HintValues.TRUE)
.setHint(QueryHints.REFRESH_CASCADE, CascadePolicy.CascadeAllParts)
.getSingleResult();

JPA生成大量查询以获取所有依赖对象(即获取实体的约90个查询)。 有没有办法强制JPA使用连接而不是独立查询?

2 个答案:

答案 0 :(得分:4)

您可以使用连接提取或批量提取来优化关系。此外,你应该在你的人际关系中使用LAZY,以避免在不需要时加载它们。

请参阅, http://java-persistence-performance.blogspot.com/2010/08/batch-fetching-optimizing-object-graph.html

答案 1 :(得分:2)

在您的查询中,您可以使用joinfetch自行构建查询。

例如,如果您的实体有

@OneToMany public List<RelatedEntity> things;

然后您的查询可以使用:

select t from entityName t join fetch t.things where t.id = ?1

阅读JPQL(Java持久性查询语言)文档。