2014-07-17 57 views
1

我正在使用EntityManager(「em」)並使用方法「createQuery」創建查詢,但它更改我的查詢,如果我使用方法「createNativeQuery」它工作正常,但比我不能添加一個列表參數。JPA正在改變我的查詢,並給我完全錯誤的結果

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

我解決它做如下:

第一:從JPA 2.0.X 更新到2.1.x的

二: 在HAVING子句我加在選擇所用的柱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鏈接,我忘了提及這一點。

它只是工作,但仍然不滿意JPA解析器,它需要改進。