如何使用我的规格书中的CriteriaQuery订购列表?

时间:2019-06-25 10:08:46

标签: java spring-boot criteria-api

我正在尝试订购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的属性。因此,在此规范中,我获得了具有指定MessageEntity的ID的DemandeEntity的列表。

现在,我想做一个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对象?

2 个答案:

答案 0 :(得分:0)

尝试一下:

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

答案 1 :(得分:0)

我发现规范类没有解决方案,所以我决定使用Sort类对列表进行排序:

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

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

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