JPA 的 Sort 对象在不同的​​表中具有属性

问题描述

TL;博士

问题是:

继续阅读以获取更多上下文


在我的项目中,我有以下抽象类 QueryParams

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 类需要扩展以支持不同的查询根。