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 セッションを閉じたときにオブジェクトの代わりにプロキシを使用しないようにしたいと考えています。オブジェクト X まで TaskInfo->Task->TaskData-> など。 .

それを行う方法はこれです

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を取得しようとしているからだと思います。これを修正する方法を知っていますか?

4

1 に答える 1

1

クエリにa を追加して、 5.6.2 章または9.3.3章で説明されているfetch()ように、他の遅延リンク オブジェクトのロードを保証することができます。

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

私は自分でテストしていないので、うまくいくことを願っています。

于 2013-09-19T09:43:18.210 に答える