![](/img/trans.png)
[英]setParameter issue with createNativeQuery of entityManager JPA
[英]Implementing pagination in JPA EntityManager createNativeQuery
我正在使用JPA EntityManager createNativeQuery
編寫查詢,我想應用分頁。 以下是我到目前為止實現的代碼:
private static final int NO_OF_RESULTS_IN_A_PAGE = 30;
public Page<Car> getFilteredCars(int page, String model, String manufacturedYear) {
Pageable pageable = PageRequest.of(page, NO_OF_RESULTS_IN_A_PAGE, Sort.by("addedDate").descending());
StringBuilder sb = new StringBuilder("SELECT c.* FROM car c WHERE c.model = ").append(model).append(" AND");
if(manufacturedYear != null) {
sb.append(" c.manufactured_year = ").append(manufacturedYear).append(" AND");
}
sb.append(" c.for_sale = true ORDER BY c.added_date DESC");
Query query = entityManager.createNativeQuery(sb.toString(), Car.class);
query.setFirstResult(page * NO_OF_RESULTS_IN_A_PAGE);
query.setMaxResults((page * NO_OF_RESULTS_IN_A_PAGE) + NO_OF_RESULTS_IN_A_PAGE);
Page<Car> results = new PageImpl<>(query.getResultList(), pageable, 0);
return results;
}
問題是在new PageImpl<>
構造函數中,我必須將項目總數作為第三個參數傳遞。 在查詢運行之前,我不知道有多少項目。 如果我傳遞 0(如上面的代碼),我只會返回第一頁,即使數據庫中實際上有超過 1000 個項目,總項目也將是 30。 PageImpl
還有一個更簡單的構造函數,它只接受一個參數( query.getResultList()
),但結果將是未分頁的。 這導致我運行了兩次查詢,一次是獲取從查詢返回的項目總數(未分頁),然后使用它來獲取分頁結果。 顯然,必須有更好的方法來實現這一點,而我一直無法弄清楚。
請注意,我的實際查詢比上面描述的涉及多個 if-else 條件檢查的查詢要復雜得多,因此不適合通過簡單的JpaRepository
實現或使用可以輕松實現分頁的@Query
進行查詢。
我擔心在執行實際的 select 之前,除了讓數據庫通過附加查詢計算汽車總數之外別無他法。 喜歡
SELECT count(1) FROM car c WHERE c.model = ...
簡單計數比返回 n>1 行的選擇要快得多。 當然,計數會減慢執行速度,但在現代數據庫上,這只會花費幾毫秒——我們人類無法識別的東西;-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.