我正在嘗試使用QueryDSL分頁 - 使用com.mysema.querydsl包。如何在使用QueryDSL編寫動態查詢時使用Spring的分頁(使用Pageable)?
我所有的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());
}
但是,要做到這一點 -
- 我需要JPQLQuery對象傳遞給applyPagination方法。我怎麼能做到這一點,而不改變我的代碼(Ofcourse,存儲庫類將擴展QueryDslRepositorySupport類)。目前,我正在使用JPAQuery。
OR
- 我可能需要通過使它們延伸代替EntityPathBase EntityPath使得我可以使用JPQLQuery.from()生成查詢,以改變我QueryDSL類型然後使用applyPagination方法,該方法需要一個JPQLQuery對象。但是,我的Q類擴展了EntityPathBase類。我應該使用com.querydsl包而不是com.mysemsa.querydsl包來生成查詢類型嗎?
- 另一種選擇是使用下面的 - 以下http://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/querydsl/QueryDslPredicateExecutor.html#findAll-com.querydsl.core.types.Predicate-org.springframework.data.domain.Pageable-
OR
代碼片段 -
Page<T> page = QueryDslPredicateExecutor.findAll(org.springframework.data.querydsl.Predicate predicate, Pageable pageable)
然而,我在兩個表之間進行連接,然後使用where子句過濾結果(如您在上面的代碼中所見)。如何在上面的findAll方法中傳遞一個謂詞對象?不知道如何在其中包含連接。
請讓我知道如果問題不清楚,我可以添加更多的細節。
編輯:國家和ActiveCountry之間有一個多對一的關係。 Country class有一個ActiveCountry引用。我們必須在兩個ID之間進行連接。國家可能有空ActiveCountry是可能的。因此,我們希望有一個內部聯接 - 僅適用於主動的國家非空值
@ManyToOne
@JoinColumn(name="id")
ActiveCountry active;
任何人對此有任何輸入? – Righto
我正在努力解決同樣的問題。你有沒有找到解決方案?謝謝! – ejgreenwald