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

問題ありません。バグレポートを見つけました。他の誰かがそれを必要とする場合に備えて、ここにあります。Criteria api は group by ステートメントを無視します

于 2015-05-29T12:51:52.070 に答える
1

QueryHints でフェッチ行を変更すると、すべてが機能するため、Eclipselink にバグを報告します。

これを変更します (この行で、子エンティティが設定された重複した 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

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 に答える