JPA:仅为查询强制执行急切加载

时间:2013-09-19 08:54:43

标签: hibernate jpa

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

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-&gt; Task-&gt; TaskData-&gt;依此类推,直到对象X。

这样做的方法是

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

但这很糟糕,对吧?我一般不想更改提取,但仅限于此特定查询。我该怎么做?谢谢&amp;欢呼声


感谢您的帮助。但 任务有一个属性

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。你知道怎么解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您可以在查询中添加fetch(),以保证其他延迟链接对象的加载在第5.6.2章中为described here或在第9.3.3章中为here

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

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