【问题标题】:How can I order a list using the CriteriaQuery in my Specifications?如何使用规范中的 CriteriaQuery 订购列表?
【发布时间】:2019-06-25 10:08:46
【问题描述】:

我正在尝试对 JpaRepository 返回的列表进行排序。我使用Specification 类而不是@Query 注释,根据this question,我应该使用CriteriaQuery 对象。

我目前的规格如下:

public class MessageSpecification {

    public static Specification<MessageEntity> hasDemandeId(Long demandeId) {
        return (root, query, criteriaBuilder) -> {
            // TODO : order the list
            return criteriaBuilder.equal(root.join(MessageEntity_.demande).get(DemandeEntity_.idTechnique), demandeId);
        };
    }
}

如您所见,我这里有两个实体类MessageEntityDemandeEntity,其中MessageEntity 有一个引用DemandeEntity 的属性。因此,在本规范中,我得到了具有指定 DemandeEntity 的 ID 的 MessageEntity 列表。

现在我想做相当于ORDER BY Message.ID 的操作。为此,我尝试在我的谓词中使用CriteriaQuery 对象(变量query):

return (root, query, criteriaBuilder) -> {
    query.orderBy(criteriaBuilder.asc(root.get(MessageEntity_.idTechnique)));
    return criteriaBuilder.equal(root.join(MessageEntity_.demande).get(DemandeEntity_.idTechnique), demandeId);
};

但它不起作用,无论我使用criteriaBuilder.desc() 还是criteriaBuilder.asc(),它仍然以相同的顺序返回列表。

我猜我做错了什么,我应该如何使用 CriteriaQuery 对象?

【问题讨论】:

    标签: java spring-boot criteria-api


    【解决方案1】:

    试试这个:

    return query.where(criteriaBuilder.equal(root.join(MessageEntity_.demande).get(DemandeEntity_.idTechnique), demandeId))
                .orderBy(cb.asc(root.get(MessageEntity_.idTechnique)))
                .distinct(true)
                .getRestriction();
    

    【讨论】:

    • 不幸的是它不起作用:(我已经尝试使用asc()desc()再次得到相同的结果@Artiow
    【解决方案2】:

    我没有找到规范类的解决方案,所以我决定使用排序类来排序我的列表:

    public Sort sortByIdTechnique(){
        return new Sort(Sort.Direction.ASC, "idTechnique");
    }
    

    JpaRepository 的findAll 接受一个 Sort 对象作为参数以及一个 Specification:

    List<MessageEntity> messages = repository.findAll(MessageSpecification.hasDemandeId(idDemande), sortByIdTechnique());
    

    【讨论】:

      猜你喜欢
      • 2021-11-12
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-26
      相关资源
      最近更新 更多