我想按关系属性进行排序,我使用 toPredicat
(Jpa Specification
,SpringBoot 框架)来生成查询。
我得到了正确的顺序,但问题是没有此关系(关系为空)的行已从结果集中删除。
下面是一个例子:
假设我们有两个实体,Email
,其中可能有Document
。
我想使用 Document.name
(Document
的属性 name)来订购 Emails
所以我有我的规范:
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"));
关于java - Spring - 使用 CriteriaQuery (规范)的 OrderBy 关系属性会忽略没有关系的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59225711/