2017-03-20 24 views
1

我使用休眠3.6.3最終版本(我知道這是相當古老,但是這就像我目前正在這個項目上工作)。
我有一個問題,做連接和分頁,以便我得到一個記錄重複結果是由休眠引起的。
這是我的代碼:休眠連接和分頁重複記錄

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; 
} 

當我打的生成和DB服務器上運行的查詢,那麼我就沒有這個重複記錄。但是調試我的代碼,listCriteria.list()返回數據集重複。另外當我註釋掉這兩行listCriteria.setFirstResult(params.getFirstResultIdx()); listCriteria.setMaxResults(params.getPageSize());,那麼listCriteria.list()沒有重複,沒關係。
所以,這表明我有分頁問題和其他標準問題(連接和排序)。
有沒有人有想法如何解決這個問題?這是休眠錯誤嗎?將增加休眠版本到最新版本(5.2.9.Final)有幫助嗎?這種大版本升級是否有任何潛在的問題?
謝謝你的幫助。

mismas

回答

1

兩件事情:

  • 如果你在同一個頁面中看到重複的行,那麼你有你的加入問題。嘗試記錄SQL查詢,然後手動執行。解決此問題的最佳方法是使用criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
  • 對於您的分頁,如果getOrdering()爲空,則不會添加任何order by。雖然,要正確分頁,您絕對需要需要按訂單條款。將listCriteria.addOrder(Order.asc("id"));添加到您的代碼中,以便Id是最後的手段排序。
+0

重複的行位於不同的頁面上。我試圖手動執行SQL查詢,結果中沒有重複的記錄。在這種情況下訂購也給出。你認爲這是冬眠的bug嗎? – mismas

+1

謝謝!問題在於訂購畢竟。並不是說它缺少了,而是模棱兩可。我通過創建的日期進行了排序,該日期是oracle日期數據類型,db中的數據具有相同的創建日期值。所以排序並不明確。在通過id添加排序之後(以及創建日期),一切都奏效了。再次感謝你! – mismas