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 回傳型別。
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>
}
});
}
HibernateCallback<List<Book>>:外層泛型指定回傳型別為 List<Book>。doInHibernate 回傳 List<Book>,與泛型一致。setFirstResult (offset)、setMaxResults (limit)。List list = null 變數,直接回傳 execute() 結果。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 簡化分頁查詢。