1

如何在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:

我得到这个 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 ?, ?
4

3 回答 3

1

GROUP BY 查询的 SQL 肯定应该包含一个 GROUP BY。确保您正确编译和部署代码。

忽略 group by 可能是一个错误,因为正常的 group by 查询不会选择对象,而是选择聚合值。检查您使用的是最新版本,并可能记录错误,或尝试 JPQL。

一般来说,您的查询没有任何意义,通常在按查询分组时,您只能选择分组依据的字段或聚合函数。

也许考虑批量获取而不是连接获取。

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

于 2013-01-24T14:05:39.033 回答
1

我将在 Eclipselink 中提交一个错误,因为如果我使用 QueryHints 更改 fetch 行,一切正常:

改变这个(用这条线我得到重复的 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 是相同的。

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

typedQuery.setMaxResults(500);
System.out.println(typedQuery.getResultList().size()); //prints 413
于 2013-01-25T07:29:42.463 回答
1

没问题,我找到了错误报告,就在这里,以防万一其他人需要它。Criteria api 忽略 group by 语句

于 2015-05-29T12:51:52.070 回答