我需要使用条件构建器进行连接,然后获取Tuple
(Object[]
)类型的结果。第一个元组元素应该是Preke
(这可以正常工作),第二个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);
答案 0 :(得分:3)
JPA不支持按预期返回集合,而是为每个Preke PrekeTiekejas对返回一个元组。您需要自己处理结果并构建列表,或者更改您的期望。
由于您正在查询已经有PrekeTiekejas集合映射的Preke实体,您可以返回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());
}