jpa lazy使用条件api获取多个级别的实体

Ste*_*olf 8 jpa openjpa fetch criteria-api jpa-2.0

我正在使用JPA2和它的Criteria API来从数据库中选择我的实体.实现是WebSphere Application Server上的OpenJPA.我的所有实体都使用Fetchtype = Lazy建模.

我从数据库中选择一个具有某些条件的实体,并希望一次从子表中加载所有嵌套数据.如果我有一个数据模型,其中表A将oneToMany连接到表B,我可以在条件查询中使用Fetch子句:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<A> cq = cb.createQuery(A.class);
Root<A> root = cq.from(A.class);
Fetch<A,B> fetch = root.fetch(A_.elementsOfB, JoinType.LEFT);
Run Code Online (Sandbox Code Playgroud)

这很好用.我得到一个元素A,它的所有元素都被正确填充.现在表B与表C具有oneToMany关系,我也想加载它们.所以我在我的查询中添加以下语句:

Fetch<B,C> fetch2 = fetch.fetch(B_.elementsOfC, JoinType.LEFT);
Run Code Online (Sandbox Code Playgroud)

但这不会做任何事情.

有人知道如何在一个查询中获取多级实体吗?

Mik*_*unu 10

它不适用于JPQL,也无法在CriteriaQueries中使用它.规范将获取的实体限制为直接从返回的实体引用的实体:

关于使用CriteriaQuery进行提取连接:

fetch方法引用的关联或属性必须从作为查询结果返回的实体或embeddable引用.

关于JPQL中的fetch join:

FETCH JOIN子句右侧引用的关联必须是从实体引用的关联或元素集合,或者作为查询结果返回的可嵌入集合.

OpenJPA文档中也说明了相同的限制.

  • 哦,你是对的.所以我只能说:哎呀.但无论如何......有什么实践可以解决这样的问题吗?我想这个世界上有很多人想要获取两张以上的桌子.我是否必须先加入第二个表格,还是应该手动读取其他数据?最佳做法是什么? (6认同)