JPA正在改变我的查询并给我完全错误的结果

时间:2014-07-17 17:45:23

标签: jpa

我正在使用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)) = ?)

显然我得错了结果,它正在检查错误的表格。

这是一个错误还是我做错了什么?我找不到为什么会这样。感谢。

1 个答案:

答案 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 解析器,它需要改进。