簡體   English   中英

在 JPA EntityManager createNativeQuery 中實現分頁

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM