Eclipselink group by不工作

时间:2013-01-24 12:39:06

标签: java jpa group-by eclipselink criteria-api

如何在下面的代码中添加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)对我来说不是一个选择。因为该命令会挂起整个语句,如果我使用EXPLAINWhen distinct is uesd

如果我在查询中使用GROUP BY,则EXPLAIN为: enter image description here

编辑2:

我使用和不使用criteriaQuery.groupBy(from.get(minutis.Preke_.prId));

获取此SQL语句
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 ?, ?

3 个答案:

答案 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