私はハイバネート3.6.3ファイナルバージョンを使用しています(これはかなり古いですが、これは現在私が現在取り組んでいるこのプロジェクトのものです)。
私は、1つのレコードが休止状態によって引き起こされる結果に複製されるようにするために、結合とページ付けに問題があります。
これは私が持っているコードです:ハイバネートジョインとページネーションを持つ重複レコード
public Page<T> findByCriteriaPaginated(PageParams params, Criteria countCriteria, Criteria listCriteria, String[] joins) {
Page<T> page = new Page<T>(params);
// count criteria
countCriteria.setProjection(Projections.rowCount());
page.setTotalCount(((Long) countCriteria.uniqueResult()).intValue());
// fetch criteria
listCriteria.setFirstResult(params.getFirstResultIdx());
listCriteria.setMaxResults(params.getPageSize());
if (params.getOrdering() != null && params.getOrdering().getSize() > 0) {
for (Iterator<String> it = params.getOrdering().getKeyIterator(); it.hasNext();) {
String key = it.next();
if (params.getOrdering().isAscending(key)) {
listCriteria.addOrder(Order.asc(key));
} else {
listCriteria.addOrder(Order.desc(key));
}
}
}
if (joins != null && joins.length > 0) {
for (String s : joins) {
listCriteria.setFetchMode(s, FetchMode.JOIN);
}
}
page.setResults(listCriteria.list());
return page;
}
Iが生成され、DBサーバー上で実行されるクエリを打つとき、私はこの重複したレコードを持っていません。しかし、私のコードをデバッグすると、listCriteria.list()
は重複してデータセットを返します。また、私はこれらの2行をコメントアウトすると、、次にlistCriteria.list()
に重複はありません。
これは、ページネーションと残りの基準(結合と順序付け)に問題があることを示しています。
これを解決する方法は誰にも分かりますか?この休止状態のバグですか?冬眠のバージョンを最新のもの(5.2.9。最終的なもの)に増やすでしょうか?このような大規模なバージョンアップグレードに潜在的な問題はありますか?
ありがとうございました。
mismas
重複する行は異なるページにあります。 SQL問合せを手動で実行しようとしましたが、結果に重複レコードはありません。この場合の注文も表示されます。これは休止状態のバグだと思いますか? – mismas
ありがとう!結局のところ、問題は注文することであった。行方不明ではなく、あいまいでした。私はoracle dateデータ型であり、db内のデータは同じ作成日付値で作成された日付で注文していました。だから注文はあいまいではなかった。 IDで注文を追加した後も(作成日とともに)すべてが機能しました。ありがとうございました! – mismas