2

Tuple条件ビルダーと結合してから、 (Object[])タイプの結果を取得する必要があります。最初のタプル要素はである必要がありPreke(これは正しく機能します)、2番目Tupleの要素はオブジェクトList<PrekeTiekejas>を含む必要があり@OneToManyます。単一のオブジェクトをList<PrekeTiekejas>返す代わりに、次のコード。PrekeTiekejas私が間違ったことは何ですか?

CriteriaBuilder cb = MinutisManager.getInstance().getCriteriaBuilder();
CriteriaQuery<Tuple> criteriaQuery = cb.createTupleQuery();
Root<minutis.Preke> from = criteriaQuery.from(minutis.Preke.class);
ListJoin<minutis.Preke, minutis.PrekeTiekejas> tiekejai = from.joinList(Preke_.tiekejai.getName());
criteriaQuery.multiselect(from, tiekejai);

TypedQuery<Tuple> typedQuery = MinutisManager.getInstance().createQuery(criteriaQuery);
//pages
typedQuery.setFirstResult(0);
typedQuery.setMaxResults(100);
//typedQuery.setHint(QueryHints.REFRESH, HintValues.TRUE);

List<Tuple> tuples = typedQuery.getResultList();
for(Tuple t : tuples) {
   minutis.Preke preke = t.get(0, minutis.Preke.class);
   System.out.println(preke.getPavadinimas());
   List<minutis.PrekeTiekejas> tiek = t.get(1, List.class);
   System.out.println(tiek.size());
}

これが私が得るエラーです:

Testcase: testGetPrekesByFilters(database.dao.PrekeDAOTest):    Caused an ERROR
Element 1 type interface java.util.List is invalid for result "***PrekeTiekejas.toString()***".
java.lang.IllegalArgumentException: Element 1 type interface java.util.List is invalid  for result "***PrekeTiekejas.toString()***".
    at org.eclipse.persistence.internal.jpa.querydef.TupleImpl.get(TupleImpl.java:89)
    at database.dao.PrekeDAOTest.testGetPrekesByFilters(PrekeDAOTest.java:69)

PrekeDAOTest.java:69ライン:

List<minutis.PrekeTiekejas> tiek = t.get(1, List.class);
4

1 に答える 1

3

JPAは、期待どおりにコレクションを返すことをサポートしていません。代わりに、PrekePrekeTiekejasペアごとにタプルを返します。結果を処理してリストリストを自分で作成するか、期待するものを変更する必要があります。

PrekeTiekejasへのコレクションマッピングがすでにあるPrekeエンティティをクエリしているので、Prekeを返し、コレクションの各エンティティでgetPrekeTiekejas()を呼び出すことができます。クエリでjoinListの代わりにroot.fetch(Preke_.tiekejai.getName()、JoinType.LEFT)を使用して、関連するエンティティがクエリでフェッチされるようにします。何かのようなもの:

CriteriaQuery<minutis.Preke> criteriaQuery = cb.createQuery(minutis.Preke.class);
Root<minutis.Preke> from = criteriaQuery.from(minutis.Preke.class);
from.fetch(Preke_.tiekejai.getName(), JoinType.LEFT);
criteriaQuery.select(from);//not really needed

TypedQuery<minutis.Preke> typedQuery = MinutisManager.getInstance().createQuery(criteriaQuery);
//pages
typedQuery.setFirstResult(0);
typedQuery.setMaxResults(100);
//typedQuery.setHint(QueryHints.REFRESH, HintValues.TRUE);

List<minutis.Preke> prekeList= typedQuery.getResultList();
for(minutis.Preke p : prekeList) {
   System.out.println(preke.getPavadinimas());
   List<minutis.PrekeTiekejas> tiek = preke.getTiekejai();//assumes tiekejai has a getTiekejai accessor
   System.out.println(tiek.size());
}
于 2013-01-23T16:34:56.610 に答える