1

请,我的 JPA 查询是使用 CriteriaQuery 和 CriteriaBuilder 创建的,如下所示:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<TaskInfo> cq = cb.createQuery(TaskInfo.class);
Root<TaskInfo> from = cq.from(TaskInfo.class);
cq.select(from);
...
from.get("task").get("id").in(taskList)
...

我想确保我急切地加载整个对象图,以便稍后在我关闭 JPA 会话时我没有代理而不是对象。:TaskInfo->Task->TaskData->等等,直到对象 X .

一种方法是这样

for(TaskInfo ti : tiList){
    ti.getTask().getTaskData().getSomethingElse().getX();
}

但这很糟糕,对吧?而且我一般不想更改获取,但仅针对此特定查询。我该怎么做?谢谢和欢呼


谢谢您的帮助。但是Task有一个属性

PeopleAssignments peopleAssignments

并且 PeopleAssignments 有一个属性

List<OrganizationalEntity> businessAdministrators

所以这行得通

from.fetch("task").fetch("peopleAssignments") // Returns a SingularAttributeJoin

但如果我这样做

from.fetch("task").fetch("peopleAssignments").fetch("businessAdministrators")

我得到:

java.lang.ClassCastException:org.hibernate.ejb.metamodel.SingularAttributeImpl 不能转换为 javax.persistence.metamodel.ManagedType

我想是因为这一次我试图获取 List。你知道如何解决这个问题吗?

4

1 回答 1

1

您可以在查询中添加一个fetch()以保证加载其他惰性链接对象,第 5.6.2 章或第9.3.3章所述。

Root<TaskInfo> from = cq.from(TaskInfo.class);
Join<TaskInfo, Task> task = from.fetch("task");
task.fetch("id");
...

我没有自己测试它,所以我希望这有效。

于 2013-09-19T09:43:18.210 回答