【问题标题】:JPA : Forcing eager load only for a queryJPA:仅对查询强制急切加载
【发布时间】:2013-09-24 16:54:05
【问题描述】:

请,我的 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();
}

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


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

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

【问题讨论】:

    标签: hibernate jpa


    【解决方案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");
    ...
    

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

    【讨论】:

    • 谢谢。但是 Task 有一个 PeopleAssignments peopleAssignments 和 PeopleAssignments 有一个 List businessAdministrators 所以这个工作 from.fetch("task").fetch("peopleAssignments") // 返回一个 SingularAttributeJoin 但如果我这样做 from.fetch("task" ).fetch("peopleAssignments").fetch("businessAdministrators") 我得到: java.lang.ClassCastException: org.hibernate.ejb.metamodel.SingularAttributeImpl cannot be cast to javax.persistence.metamodel.ManagedType 我想是因为这次我正在尝试获取列表。你知道如何解决这个问题吗?
    • 对不起,我不知道。
    猜你喜欢
    • 2012-08-17
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 2014-07-29
    • 2023-03-25
    相关资源
    最近更新 更多