如何將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)
不是我的選擇。因爲該命令掛起整個聲明,如果我使用EXPLAIN
:
如果我在查詢中使用GROUP BY
,然後EXPLAIN
是:
編輯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 ?, ?
你在找什麼?使用group by和返回實體並不是一個好主意,特別是不會幫助你的讀取連接子句 - 它會破壞返回的實體和緩存。 – Chris
嘗試開啓ElcipseLink日誌記錄來記錄它執行的SQL,如http://wiki.eclipse中所述。org/EclipseLink/Examples/JPA/Logging – Chris
我完全禁用了緩存,因爲我使用了獨立的swing程序,而不是JEE(這是我的決定)。我需要的是,Fetch將在一個查詢中填充帶有子項的父實體 - 並且工作正常。 Group by是必需的,因爲'Preke'實體具有@OneToMany'PrekeTiekejas'實體,並且我得到'Preke'的重複行,只是不同的'PrekeTiekejas'字段。我的目標是在相同的查詢中獲取單個Preke實體並將其填充到子元素@OneToManyPrekeTiekejas中 - 對數據庫的單個調用。 – Minutis