繁体   English   中英

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

[英]How can I order a list using the CriteriaQuery in my Specifications?

我正在尝试订购JpaRepository返回的列表。 我使用的是Specification类而不是@Query注释,根据这个问题 ,我应该使用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 为此,我尝试在谓词(变量query )中使用CriteriaQuery对象:

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对象?

尝试这个:

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM