Querydsl - 分页功能

Zie*_*zyk 6 querydsl

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

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

问题是:

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

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

小智 18

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);
Run Code Online (Sandbox Code Playgroud)


Adi*_*lil 8

这里太晚了,但有人可能会发现它有帮助。

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

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

QueryResults<Tuple> result = query.fetchResults();
int totalCount = result.getTotal();
List<Tuple> rows = result.getResults();
Run Code Online (Sandbox Code Playgroud)

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

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

List<Tuple> rows = query.limit(20).offset(2*20).fetch();
Run Code Online (Sandbox Code Playgroud)

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