Oracleページングでorder byソートを使用してページング順序が正しくない問題の解決


今日、プロジェクトをしているときに、JPAを使って注文を時間順に並べ替えているときに、ページングデータを調べているときに問題があったことに気づきました.私はまず1ページにデータを設定して、1ページ目と2ページ目のデータが同じであることに気づきました.私のBaseDaoのJPAのページング方法を以下に示します.
    @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);
    }