我正在使用EntityManager(“em”)并使用方法“createQuery”创建查询,但它更改了我的查询,如果我使用方法“createNativeQuery”它工作正常,但我不能添加列表参数。
String query = " SELECT t0.id FROM Movie t0, Tagged t1, Tag t2 "
+ " WHERE t2.id = t1.tagfk AND t1.moviefk = t0.id AND t2.name in :tagList "
+ " GROUP BY t0.id HAVING count(distinct t2.id) = :size "
+ " ORDER BY count(t1) DESC, t0.popularity DESC";
Query q = em.createQuery(query, Integer.class);
q.setParameter("tagList", tagList);
q.setParameter("size", tagList.size());
q.setMaxResults(20);
result = (List<Integer>)q.getResultList();
这里的问题是,当我打印查询时
System.out.println(q);
我得到了
SELECT t0.ID AS a1 FROM MOVIE t0, TAG t2, TAGGED t1 WHERE (((t2.ID = t1.TAGFK) AND
(t1.MOVIEFK = t0.ID)) AND (t2.NAME IN ?)) GROUP BY t0.ID
HAVING (COUNT(DISTINCT(t0.ID)) = ?) ORDER BY COUNT(t1.ID) DESC, t0.POPULARITY DESC LIMIT ? OFFSET ?"))
如果仔细观察,请:
HAVING count(distinct t2.id) = :size
成了
HAVING (COUNT(DISTINCT(t0.ID)) = ?)
显然我得错了结果,它正在检查错误的表格。
这是一个错误还是我做错了什么?我找不到为什么会这样。感谢。
答案 0 :(得分:0)
我解决了以下问题:
第一: 从JPA 2.0.X更新到2.1.X
第二: 在 HAVING 子句中,我添加了 SELECT 和 GROUP BY 中使用的列,其中的语句不会干扰任何内容:
HAVING t0.id IS NOT NULL AND count(distinct t2.id) = :size
上述解决方案不适用于2.0.X,它将导致:
HAVING (COUNT(DISTINCT(t0.ID)) = ?) AND (COUNT(DISTINCT(t0.ID)) = ?)
怪异!!!
我正在使用Eclipse Link,我忘了提及。
它只是有效,但我仍然不满意JPA上的 HAVING 解析器,它需要改进。