Oracleページングでorder byソートを使用してページング順序が正しくない問題の解決
今日、プロジェクトをしているときに、JPAを使って注文を時間順に並べ替えているときに、ページングデータを調べているときに問題があったことに気づきました.私はまず1ページにデータを設定して、1ページ目と2ページ目のデータが同じであることに気づきました.私のBaseDaoのJPAのページング方法を以下に示します.
OrderDaoImplのページングによる注文の検索方法:
その結果,テスト中にデータのページング順序が正常ではないことが分かったが,order byを削除した後,ページング後のデータは正常であった.資料を調べた結果、ORACLEのorder byによるページの不正確な原因分析を見て、最終的に解決方法を得た.
ここでは、order byの後ろに一意性フィールド(プライマリ・キーidのような)を付けるソリューションを採用しています.
@Override
public List findPage(Integer firstIndex, Integer maxResults,String jpql,Object... obj) {
try{
Query query = em.createQuery(jpql);
if(obj.length > 0){
for (int i = 0; i < obj.length; i++) {
query.setParameter((i+1),obj[i]);
}
}
query.setFirstResult(firstIndex).setMaxResults(maxResults);
return query.getResultList();
}catch (Exception e){
return null;
}
}
OrderDaoImplのページングによる注文の検索方法:
@Override
public List findOrderByStoreId(String storeId, Integer page, Integer pageSize) {
return this.findPage((page -1) * pageSize, pageSize, "SELECT o FROM Order o WHERE o.storeId = ? order by o.createTime desc", storeId);
}
その結果,テスト中にデータのページング順序が正常ではないことが分かったが,order byを削除した後,ページング後のデータは正常であった.資料を調べた結果、ORACLEのorder byによるページの不正確な原因分析を見て、最終的に解決方法を得た.
ここでは、order byの後ろに一意性フィールド(プライマリ・キーidのような)を付けるソリューションを採用しています.
@Override
public List findOrderByStoreId(String storeId, Integer page, Integer pageSize) {
return this.findPage((page -1) * pageSize, pageSize, "SELECT o FROM Order o WHERE o.storeId = ? order by o.createTime desc, o.id", storeId);
}