问题描述
TL;博士
问题是:
继续阅读以获取更多上下文
public abstract class QueryParams {
public static final int DEFAULT_PAGE_NUMBER = 0;
public static final int DEFAULT_PAGE_SIZE = 50;
private String sort;
private int page = DEFAULT_PAGE_NUMBER;
private int size = DEFAULT_PAGE_SIZE;
public abstract Sort getSorting();
public abstract BooleanBuilder getPredicate();
public Pageable getPageable() {
Sort sorting = getSorting();
if (Objects.isNull(sorting)) {
return PageRequest.of(getPage(),getSize());
}
return PageRequest.of(getPage(),getSize(),sorting);
}
}
我们为不同的实体扩展了这个类,因此我们使用 QueryDSL 的强大功能来创建复杂的可分页查询。这是我们的用法:
entityRepository.findAll(entityQueryParams.getPredicate(),entityQueryParams.getPageable());
当我想根据不同表中的列对查询进行排序时,就会出现问题。
我们有一个特定的实体,其中包含其他实体的 ID 和 TYPE(没有直接关系),我想按另一个表的 name
列对结果进行排序。
Sort
对象通常是这样创建的:
@Override
public Sort getSorting() {
QEntity qEntity = QEntity.qEntity;
return Sort.by(ASC,qEntity.name.getMetadata().getName());
}
解决方法
显然,您可以在 JPQL 查询中加入关联,然后按该实体上的任何列进行排序。
在 QueryDSL 中可以做到:
select(QEntity.entity).from(QEntity.entity)
.innerJoin(QEntity.entity.association,QAssociation.association)
.orderBy(QAssociation.association.attribute)
您的自定义 QueryParams
类需要扩展以支持不同的查询根。