似乎在 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)
问题是:
是的,我知道 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)
这里太晚了,但有人可能会发现它有帮助。
这是最佳方法吗?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 个查询以获取受指定页面大小和偏移量“限制”的结果。
| 归档时间: |
|
| 查看次数: |
5157 次 |
| 最近记录: |