我正在尝试订购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);
};
}
}
如您所见,我这里有两个实体类MessageEntity
和DemandeEntity
,其中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
对象?
答案 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());