我正在尝试使用com.mysema.querydsl包对QueryDSL进行分页。
我的所有Querydsl查询类型都是这样的 -
@Generated("com.mysema.query.codegen.EntitySerializer")
public class QCountry extends EntityPathBase<Country> {...}
目前,我的存储库实现类看起来像这样 -
@Override
public Page<Country> findPaginatedCountries(String country, Optional<String> status, Pageable pageable) {
QCountry qCountry= QCountry.someObject;
QActiveCountry qActiveCountry = QActiveCountry.activeCountry;
JPAQuery jpaQuery = new JPAQuery(entityManager);
QueryBase queryBase = jpaQuery.from(qCountry).innerJoin(qActiveCountry).fetch()
.where(qCountry.codeLeft.country.upper().eq(country.toUpperCase()))
.where(qCountry.codeRight.country.upper().eq(country.toUpperCase()));
if(status.isPresent()){
queryBase = queryBase.where(qActiveCountry.id(qCountry.active.id))
.where(qActiveCountry.status.upper().eq(status.get().toUpperCase()));
}
.......}
现在,我希望此动态查询返回分页响应。我想使用Spring的分页来做到这一点,而不是手动设置偏移量,大小等。
我知道我可以使用QueryDslRepositorySupport类 - 在此处实现 - https://github.com/keke77/spring-data-jpa-sample/blob/master/spring-data-jpa/src/main/java/com/gmind7/bakery/employee/EmployeeRepositoryImpl.java
以上链接中的示例代码 -
@Override
public Page<Employees> QFindByOfficeCode(long officeCode, Pageable pageable) {
//JPAQuery query = new JPAQuery(em);
JPQLQuery query = from(QEmployees.employees).where(QEmployees.employees.officeCode.eq(officeCode));
query = super.getQuerydsl().applyPagination(pageable, query);
SearchResults<Employees> entitys = query.listResults(QEmployees.employees);
return new PageImpl<Employees>(entitys.getResults(), pageable, entitys.getTotal());
}
然而,要做到这一点 -
OR
OR
以下代码段 -
Page<T> page = QueryDslPredicateExecutor.findAll(org.springframework.data.querydsl.Predicate predicate, Pageable pageable)
但是,我在两个表之间进行连接,然后使用where子句过滤结果(正如您在我的代码中所见)。如何在上面的findAll方法中传递谓词对象?不知道如何在其中加入联接。
如果问题不明确,请告诉我,我可以添加更多详细信息。
编辑:Country和ActiveCountry之间存在多对一的关系。 Country类具有ActiveCountry引用。我们必须在两个ID之间进行连接。有可能Country可以有null ActiveCountry。因此,我们需要一个内部联接 - 只有活动国家/地区的非空值@ManyToOne
@JoinColumn(name="id")
ActiveCountry active;
答案 0 :(得分:1)
第1步:使用
注释实体类@QueryEntity
@Entity
@QueryEntity
public class Country {}
由于问题显示Q
类,因此似乎已经解决了这个问题。
第2步:让存储库界面扩展
QueryDslPredicateExecutor
public interface CountryRepository
extends PagingAndSortingRepository<Country, Long>
, QueryDslPredicateExecutor<Country> {
}
第3步:调用
提供的Page<T> findAll(Predicate query, Pageable page)
QueryDslPredicateExecutor
方法
public Page<Country> getCountries(String country, Optional<String> status, Pageable page) {
QCountry root = QCountry.country;
BooleanExpression query = root.codeLeft.country.equalsIgnoreCase(country);
query = query.and(root.codeRight.country.equalsIgnoreCase(country));
if (status.isPresent()) {
query = query.and(root.active.status.equalsIgnoreCase(status));
}
return countryRepository.findAll(query, page);
}