2013-01-23 78 views
1

我需要做一個與標準生成器的加入,然後得到TupleObject[])類型的結果。第一個元組應該是Preke(並且這個工作正常),第二個Tuple元素應該是包含@OneToMany對象的List<PrekeTiekejas>。以下代碼代替List<PrekeTiekejas>返回單個PrekeTiekejas對象。我做錯了什麼?JPA criteriaquery元組onetomany加入

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); 

回答

3

JPA不支持返回集合,你期待,而是返回一個元組的每個Preke PrekeTiekejas對。您需要處理結果並自行構建List列表,或者更改您期望的內容。

由於您正在查詢Preke實體,該Preke實體已經有一個集合映射到PrekeTiekejas,所以您可以返回Preke並在集合的每個實體上調用getPrekeTiekejas()。在查詢中使用root.fetch(Preke_.tiekejai.getName(),JoinType.LEFT)而不是joinList,以確保在查詢中獲取相關實體。例如:

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()); 
}