使用 JPQL 和 BooleanExpression 进行分页
Posted
技术标签:
【中文标题】使用 JPQL 和 BooleanExpression 进行分页【英文标题】:Pagination with JPQL and BooleanExpression 【发布时间】:2020-06-12 10:51:57 【问题描述】:我是分页新手,我想为我的 JPQL 查询分页,但我做不到,请查找以下课程:
服务:
public List<Company> getCompanies(BooleanExpression predicate, Pageable pageRequest)
return companyRepositoryImpl.getCompany(predicate, pageRequest);
存储库: @Repository 公共类 CompanyRepositoryImpl
@PersistenceContext
private EntityManager entityManager;
public <T> List<T> getCompany(BooleanExpression finalExpression, Pageable pageRequest)
int pageNumber = pageRequest.getPageNumber();
int pageSize = pageRequest.getPageSize();
long pageOffset = pageRequest.getOffset();
Sort sortValue = pageRequest.getSort();
// String str = sortValue.toString();
QCompany comp = QCompany.company;
QCompanyAddress qCompanyAddress = QCompanyAddress.companyAddress;
final JPQLQuery<QCompany> jpqlQuery = new JPAQuery(entityManager);
OrderSpecifier<?> o = qCompanyAddress.addressLine1.desc();
JPQLQuery<QCompany> query = jpqlQuery.from(comp).leftJoin(qCompanyAddress)
.on(comp.id.eq(qCompanyAddress.company.id)
.and(qCompanyAddress.statusActiveSwitch.eq(SwitchEnum.Y))
.and(qCompanyAddress.addressType.addressTypeCode.eq("1")))
.where(finalExpression).orderBy(o).limit(20);
QueryResults<QCompany> fetchResults = query.fetchResults();
List<QCompany> results = fetchResults.getResults();
fetchResults.getTotal();
return (List<T>) results;
在存储库中,我有可分页对象,但我不知道如何将它与 JPQL 一起使用。感谢您的帮助。
【问题讨论】:
【参考方案1】:要根据定义的pageable
对象加载数据,您必须从您的query
定义中删除limit(20)
。然后,您可以执行以下操作:
List<Company> companies = getQuerydsl()
.applyPagination(pageable, query)
.fetch();
你可以返回列表。
如果你想返回页面而不是列表,那么你必须改变一下 -
long total = query.fetchCount();
List<Company> companies = getQuerydsl()
.applyPagination(pageable, query)
.fetch();
return new PageImpl<>(companies, pageable, total);
希望对你有帮助。
【讨论】:
以上是关于使用 JPQL 和 BooleanExpression 进行分页的主要内容,如果未能解决你的问题,请参考以下文章