2017-03-20 8 views
1

私はハイバネート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

答えて

1

2つのこと:

  • あなたが同じページに重複行が表示された場合、あなたはあなたの加入の問題を持っています。 SQLクエリをログに記録してから、手動で実行してください。この問題を解決する最善の方法は、criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
  • となります。getOrdering()が空の場合は、を追加しません。正しくページ設定するには、絶対にが必要です。あなたのコードにlistCriteria.addOrder(Order.asc("id"));を追加して、Idが最後に注文されるようにします。
+0

重複する行は異なるページにあります。 SQL問合せを手動で実行しようとしましたが、結果に重複レコードはありません。この場合の注文も表示されます。これは休止状態のバグだと思いますか? – mismas

+1

ありがとう!結局のところ、問題は注文することであった。行方不明ではなく、あいまいでした。私はoracle dateデータ型であり、db内のデータは同じ作成日付値で作成された日付で注文していました。だから注文はあいまいではなかった。 IDで注文を追加した後も(作成日とともに)すべてが機能しました。ありがとうございました! – mismas

関連する問題