2017-02-27 35 views
1

我正在嘗試使用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()); 
    }  

但是,要做到這一點 -

  1. 我需要JPQLQuery對象傳遞給applyPagination方法。我怎麼能做到這一點,而不改變我的代碼(Ofcourse,存儲庫類將擴展QueryDslRepositorySupport類)。目前,我正在使用JPAQuery。

OR

  • 我可能需要通過使它們延伸代替EntityPathBase EntityPath使得我可以使用JPQLQuery.from()生成查詢,以改變我QueryDSL類型然後使用applyPagination方法,該方法需要一個JPQLQuery對象。但是,我的Q類擴展了EntityPathBase類。我應該使用com.querydsl包而不是com.mysemsa.querydsl包來生成查詢類型嗎?
  • OR

  • 另一種選擇是使用下面的 - 以下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-
  • 代碼片段 -

    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; 
    
    +0

    任何人對此有任何輸入? – Righto

    +0

    我正在努力解決同樣的問題。你有沒有找到解決方案?謝謝! – ejgreenwald

    回答

    1

    步驟1:註釋與@QueryEntity

    @Entity 
    @QueryEntity 
    public class Country {} 
    

    實體類這似乎已得到解決自從問題顯示Q類。

    步驟2:具有倉庫接口延伸QueryDslPredicateExecutor

    public interface CountryRepository 
           extends PagingAndSortingRepository<Country, Long> 
             , QueryDslPredicateExecutor<Country> { 
    } 
    

    步驟3: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); 
    } 
    
    調用提供的 Page<T> findAll(Predicate query, Pageable page)方法
    +0

    感謝您的回覆。然而,問題是能夠在構建Predicate或BooleanExpression時連接兩個表。你能編輯你的迴應嗎?謝謝 – Righto

    +0

    @Righto,請將實體類的最短代碼添加到您的問題中。不理解類之間的關係就很難形成查詢。 – manish

    +0

    所以基本上,Country和ActiveCountry之間有多對一的關係。 – Righto

    相關問題