首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Spring HibernateCallback 泛型約束:分頁查詢正確寫法

     編輯:程式設計疑難解答

問題代碼

public List selectBookByPrice(final int pageNo, final int pageNum) {
    List list = null;
    HibernateCallback> callback = new HibernateCallback>() {  // 語法錯誤
        // ...
    };
    list = this.getHibernateTemplate().execute(callback);
    return list;
}

錯誤原因

HibernateCallback 是單一型別參數介面:HibernateCallback<T>。原碼寫成 HibernateCallback>(缺少型別參數),且匿名類別未正確實作 doInHibernate 回傳型別。

正確寫法:明確泛型為 List<Book>

public List<Book> selectBookByPrice(final int pageNo, final int pageSize) {
    return getHibernateTemplate().execute(new HibernateCallback<List<Book>>() {
        @Override
        public List<Book> doInHibernate(Session session) throws HibernateException {
            String hql = "FROM Book ORDER BY bookPrice";
            Query query = session.createQuery(hql);
            query.setFirstResult((pageNo - 1) * pageSize);
            query.setMaxResults(pageSize);
            return query.list(); // 直接回傳 List<Book>
        }
    });
}

關鍵點

  1. HibernateCallback<List<Book>>:外層泛型指定回傳型別為 List<Book>。
  2. doInHibernate 回傳 List<Book>,與泛型一致。
  3. 分頁參數:setFirstResult (offset)、setMaxResults (limit)。
  4. 不需外部 List list = null 變數,直接回傳 execute() 結果。

現代替代方案:Spring Data JPA / Repository

public interface BookRepository extends JpaRepository<Book, Long> {
    Page<Book> findAllByOrderByBookPriceAsc(Pageable pageable);
}

// Service
Page<Book> page = bookRepository.findAllByOrderByBookPriceAsc(PageRequest.of(pageNo-1, pageSize));
List<Book> content = page.getContent();

優點:型別安全、分頁內建、可測試、無需手寫 HibernateTemplate 回調。

總結

HibernateCallback 泛型只需填入**期望的回傳型別**(如 List<Book>),匿名類別實作對應回傳即可。新專案建議直接使用 Spring Data JPA 簡化分頁查詢。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved