请使用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。你知道怎么解决这个问题吗?
答案 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");
...
我没有亲自测试,所以我希望这有效。