如何在下面的代码中添加groupBy
条件?因为如果我添加criteriaQuery.groupBy(from.get(minutis.Preke_.prId));
- 我得到完全相同的SQL语句(没有groupBy
):
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:
我使用和不使用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 :(得分:1)
GROUP BY查询的SQL绝对应该包含GROUP BY。确保您正在正确编译和部署代码。
可能是忽略group by的错误,因为查询的正常组不会选择对象,而是聚合值。检查您是否使用了最新版本,并可能记录错误,或尝试使用JPQL。
通常,您的查询没有任何意义,通常在逐个查询的组中,您只能选择分组的字段或聚合函数。
也许考虑批量提取而不是连接提取。
http://java-persistence-performance.blogspot.com/2010/08/batch-fetching-optimizing-object-graph.html
答案 1 :(得分: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:
该错误确实存在,现在最大的结果不起作用。这两种情况都是相同的。
typedQuery.setMaxResults(100);
System.out.println(typedQuery.getResultList().size()); //prints 73
typedQuery.setMaxResults(500);
System.out.println(typedQuery.getResultList().size()); //prints 413
答案 2 :(得分:1)
没问题,我发现了错误报告,就是以防其他人需要它。Criteria api ignores group by statement