gpt4 book ai didi

spring - 在使用 QueryDSL 编写动态查询时,如何使用 Spring 的分页(使用 Pageable)?

转载 作者:行者123 更新时间:2023-12-02 02:34:42 26 4
gpt4 key购买 nike

我正在尝试将分页与 QueryDSL 结合使用 - 使用 com.mysema.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());
}

但是,要做到这一点 -

  1. 我需要将 JPQLQuery 对象传递给 applyPagination 方法。我怎样才能在不更改代码的情况下做到这一点(当然,存储库类将扩展 QueryDslRepositorySupport 类)。目前,我正在使用 JPAQuery,如您所见。

或者

  • 我可能需要通过扩展 EntityPath 而不是 EntityPathBase 来更改 QueryDSL 类型,以便我可以使用 JPQLQuery.from() 生成查询,然后使用 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-
  • 下面的代码片段 -

     Page<T> page = QueryDslPredicateExecutor.findAll(org.springframework.data.querydsl.Predicate predicate, Pageable pageable)

    但是,我在两个表之间进行联接,然后使用 where 子句过滤结果(正如您在上面的代码中看到的那样)。如何在上面的 findAll 方法中传递谓词对象?不确定如何在其中包含联接。

    如果问题不清楚,请告诉我,我可以添加更多详细信息。

    编辑:Country 和 ActiveCountry 之间存在多对一关系。Country 类有一个 ActiveCountry 引用。我们必须在两个 id 之间进行连接。国家/地区可能有空的 ActiveCountry。因此,我们需要一个内部联接 - 事件国家/地区只有非空值

    @ManyToOne
    @JoinColumn(name="id")
    ActiveCountry active;

    最佳答案

    Step 1: Annotate the entity class with @QueryEntity

    @Entity
    @QueryEntity
    public class Country {}

    自从问题显示 Q 以来,这个问题似乎已经得到解决。类。

    Step 2: Have the repository interface extend QueryDslPredicateExecutor

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

    Step 3: Invoke the Page<T> findAll(Predicate query, Pageable page) method provided by 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);
    }

    关于spring - 在使用 QueryDSL 编写动态查询时,如何使用 Spring 的分页(使用 Pageable)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42486292/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com