如何使用规范中的 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);
};
}
}
如您所见,我这里有两个实体 类 MessageEntity
和 DemandeEntity
,其中 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
对象?
试试这个:
return query.where(criteriaBuilder.equal(root.join(MessageEntity_.demande).get(DemandeEntity_.idTechnique), demandeId))
.orderBy(cb.asc(root.get(MessageEntity_.idTechnique)))
.distinct(true)
.getRestriction();
我找不到符合规范 class 的解决方案,所以我决定使用排序 class 来排序我的列表:
public Sort sortByIdTechnique(){
return new Sort(Sort.Direction.ASC, "idTechnique");
}
JpaRepository 的 findAll
接受排序对象作为参数以及规范:
List<MessageEntity> messages = repository.findAll(MessageSpecification.hasDemandeId(idDemande), sortByIdTechnique());
我正在尝试对 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);
};
}
}
如您所见,我这里有两个实体 类 MessageEntity
和 DemandeEntity
,其中 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
对象?
试试这个:
return query.where(criteriaBuilder.equal(root.join(MessageEntity_.demande).get(DemandeEntity_.idTechnique), demandeId))
.orderBy(cb.asc(root.get(MessageEntity_.idTechnique)))
.distinct(true)
.getRestriction();
我找不到符合规范 class 的解决方案,所以我决定使用排序 class 来排序我的列表:
public Sort sortByIdTechnique(){
return new Sort(Sort.Direction.ASC, "idTechnique");
}
JpaRepository 的 findAll
接受排序对象作为参数以及规范:
List<MessageEntity> messages = repository.findAll(MessageSpecification.hasDemandeId(idDemande), sortByIdTechnique());