[英]order by a field in a filtered OneToMany relation using JPA Specification ( CriteriaQuery CriteriaBuilder )
[英]Spring - OrderBy relation attribute using CriteriaQuery (Specification) ignores the rows which does not have the relation
我想按关系属性排序,我使用toPredicat
(Jpa Specification
,SpringBoot 框架)来生成查询。
我得到了正确的顺序,但问题是没有这种关系(关系为空)的行已从结果集中删除。
下面是一个例子:假设我们有两个实体, Email
可能有一个Document
。 我想订购的Emails
使用Document.name
(的属性名称Document
)
所以我有我的规格:
import org.springframework.data.jpa.domain.Specification;
import javax.persistence.criteria.*;
public class EmailSpecification implements Specification<Email> {
@Override
public Predicate toPredicate(Root<Email> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
List<Predicate> predicates = new ArrayList<>();
if (xx) {
predicates.add(criteriaBuilder.like(yy);
}
//...
criteriaQuery.orderBy(criteriaBuilder.asc(
root.get('document').get('name'));
return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]))
}
}
当我打电话时
List<Email> result = emailRepository.findAll(new EmailSpecification());
我有一个顺序正确的电子邮件列表,但只有包含文档的电子邮件(我想要所有电子邮件,即使它没有文档)
我认为你应该需要一个左连接,可能是这样的:
criteriaQuery.orderBy(criteriaBuilder.asc(
root.join("document", JoinType.LEFT).get("name"));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.