【问题标题】:Querydsl - paging functionalityQuerydsl - 分页功能
【发布时间】:2016-08-04 21:27:36
【问题描述】:

似乎在 Jpa QueryDsl 中我可以使用如下分页:

return new JPAQueryFactory(getEntityManager())
    .selectFrom(entity)
    .where(where_clause)
    .orderBy(order_by_clause)
    .offset(pageNumber * 20)
    .limit(20)
    .fetchResults();

问题是:

  • 这是最佳方法吗? fetchResults 是否仅从 DB 加载 20 个元素并进行计数查询以获取有关 db 中实体总数的信息?
  • 或者也许有像 .page(2).limit(20) 这样的选项?

是的,我知道 Spring-Data 已经为 QueryDsl 提供了分页和接口,但是由于 Spring-Data 不支持复杂的“order by”子句,我无法使用它:(

【问题讨论】:

    标签: querydsl


    【解决方案1】:

    这里为时已晚,但有人可能会发现它有帮助。

    这是最佳方法吗? fetchResults 是否仅从 DB 加载 20 个元素并进行计数查询以获取有关 db 中实体总数的信息?

    是的 - 它将发出 2 个查询。一个用于使用 where 子句进行计数,另一个用于获取结果。当您有兴趣了解符合条件(where 子句)的记录数以及根据页面大小和偏移量获取数据时,这是需要的。使用 .fetchResults(),您应该使用以下方法获取总计数和返回的行数如下。

    QueryResults<Tuple> result = query.fetchResults();
    int totalCount = result.getTotal();
    List<Tuple> rows = result.getResults();
    

    或者也许有像 .page(2).limit(20) 这样的选项?

    是的 - 如果您只想获取偏移量和页面大小的结果,您应该使用

    List<Tuple> rows = query.limit(20).offset(2*20).fetch();
    

    fetch() 方法只会发出 1 个查询来获取受指定页面大小和偏移量“限制”的结果。

    【讨论】:

    • 我用作QueryResults&lt;Tuple&gt; result = query.limit(20).offset(2*20).fetchResults();,看起来工作正常。
    【解决方案2】:

    Querydsl.applyPagination()也可以用。

    org.springframework.data.domain.PageImpl;
    org.springframework.data.domain.Pageable;
    
    Querydsl querydsl = new Querydsl(entityManager, (new PathBuilderFactory()).create(<EntityClass>.class));
    JPQLQuery<?> query = new JPAQuery<>(entityManager);
    
    //TODO: prepare your query here 
    
    //Get the count
    Long totalElements = query.fetchCount();
    
    //Apply the pagination
    List<?> result = querydsl.applyPagination(pageable, query).fetch();
    
    //return a paged response
    return new PageImpl<>(result, pageable, totalElements);
    

    【讨论】:

      猜你喜欢
      • 2016-05-12
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多