2013-01-24 68 views
1

如何將groupBy標準添加到下面的代碼?因爲如果我添加criteriaQuery.groupBy(from.get(minutis.Preke_.prId)); - 我得到完全相同的SQL語句(不groupBy):Eclipselink羣由不起作用

CriteriaBuilder cb = MinutisManager.getInstance().getCriteriaBuilder(); 
CriteriaQuery criteriaQuery = cb.createQuery(minutis.Preke.class); 
Root<minutis.Preke> from = criteriaQuery.from(minutis.Preke.class); 
from.fetch(minutis.Preke_.tiekejai, JoinType.LEFT).fetch(minutis.PrekeTiekejas_.tiekejas, JoinType.LEFT); 
//criteriaQuery.groupBy(from.get(minutis.Preke_.prId)); 

TypedQuery<minutis.Preke> typedQuery = MinutisManager.getInstance().createQuery(criteriaQuery); 
typedQuery.setFirstResult(0); 
typedQuery.setMaxResults(100); 
typedQuery.getResultList(); 

編輯1:

criteriaQuery.distinct(true)不是我的選擇。因爲該命令掛起整個聲明,如果我使用EXPLAINWhen distinct is uesd

如果我在查詢中使用GROUP BY,然後EXPLAIN是: enter image description here

編輯2:

我得到這個SQL聲明有和沒有criteriaQuery.groupBy(from.get(minutis.Preke_.prId));

SELECT ... FROM preke t1 LEFT OUTER JOIN preke_tiekejas t0 ON (t0.pr_id = t1.pr_id) LEFT OUTER JOIN tiekejas t2 ON (t2.tiek_id = t0.tiek_id) LEFT OUTER JOIN gamintojas t3 ON (t3.gam_id = t1.gam_id) LEFT OUTER JOIN google_compare t4 ON (t4.pr_id = t1.pr_id) LEFT OUTER JOIN grupe t5 ON (t5.pgs_id = t1.pgs_id) LEFT OUTER JOIN preke_kaina t6 ON (t6.pr_id = t1.pr_id) ORDER BY t1.pr_id LIMIT ?, ? 
+0

你在找什麼?使用group by和返回實體並不是一個好主意,特別是不會幫助你的讀取連接子句 - 它會破壞返回的實體和緩存。 – Chris

+0

嘗試開啓ElcipseLink日誌記錄來記錄它執行的SQL,如http://wiki.eclipse中所述。org/EclipseLink/Examples/JPA/Logging – Chris

+0

我完全禁用了緩存,因爲我使用了獨立的swing程序,而不是JEE(這是我的決定)。我需要的是,Fetch將在一個查詢中填充帶有子項的父實體 - 並且工作正常。 Group by是必需的,因爲'Preke'實體具有@OneToMany'PrekeTiekejas'實體,並且我得到'Preke'的重複行,只是不同的'PrekeTiekejas'字段。我的目標是在相同的查詢中獲取單個Preke實體並將其填充到子元素@OneToManyPrekeTiekejas中 - 對數據庫的單個調用。 – Minutis

回答

1

我將文件中的EclipseLink的錯誤,因爲如果我改變取得與QueryHints線,一切正常:

更改此設置(這條線,我得到複製Preke實體人口子女實體):

from.fetch(minutis.Preke_.tiekejai, JoinType.LEFT).fetch(minutis.PrekeTiekejas_.tiekejas, JoinType.LEFT); 

要這樣(與此行我與孩子居住於實體獨特Preke實體):

typedQuery.setHint(QueryHints.LEFT_FETCH, "Preke.tiekejai"); 
typedQuery.setHint(QueryHints.LEFT_FETCH, "Preke.tiekejai.tiekejas"); 

我得到了我想要的結果。

編輯1:

的錯誤確實存在,現在最大resulsts不工作。 typedQuery這兩種情況都是相同的。

typedQuery.setMaxResults(100); 
System.out.println(typedQuery.getResultList().size()); //prints 73 

typedQuery.setMaxResults(500); 
System.out.println(typedQuery.getResultList().size()); //prints 413 
+0

你最終提出了eclipselink的錯誤,我現在有同樣的問題,groupBy和maxResults不能一起工作。 Thanxs –

+0

說實話,我不記得了。對不起,這只是很久以前。我知道我應該立即更新我的問題或回答與創建錯誤鏈接,但它是如何... – Minutis

1

GROUP BY查詢的SQL應絕對包含GROUP BY。確保您正在編譯和部署代碼。

這可能是一個錯誤,group by被忽略,因爲正常的查詢組不會選擇對象,而是聚合值。檢查您是否使用最新版本,並且可能記錄一個錯誤,或嘗試JPQL。

一般而言,您的查詢沒有任何意義,通常在按組查詢時,您只能選擇按分組的字段或聚合函數。

也許考慮批量抓取而不是連接抓取。

http://java-persistence-performance.blogspot.com/2010/08/batch-fetching-optimizing-object-graph.html

+0

如果我使用批量抓取,查詢起作用,然後我不需要抓取並且不需要group by,但與GROUP BY語句相比性能下降。我會研究bug的可能性。 – Minutis

+0

查詢完成我想要的工作(填充父母孩子,速度是完美的),但是它會返回重複的Preke對象。這是我留下的唯一問題。 – Minutis