考虑下面的实体-
class Team {
private String name;
@OneToMany
private Set<Employee> employees;
}
class Employee {
private String name;
@OneToMany
private Set<Skill> skills;
}
class Skill {
private String name;
private boolean active;
private Date expiryDate;
}
我需要对团队结果集进行排序,使具有最大活动和未过期技能的团队排在第一位。我使用springboot规范和criteriaquery来过滤不同领域的团队。到目前为止,我有下面的代码,这不是预期的工作。
public class TeamSpecs implements Specification<Team> {
@Override
public Predicate toPredicate(Root<Team> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
Order o = cb.desc(cb.sum(cb.size(root.join("employees").get("skills")));
cq.orderBy(o));
return cb.like(cb.equal(root.get("name"), "%" + value + "%"));
}
}
我有什么遗漏吗?请建议
1条答案
按热度按时间cwxwcias1#
要做到这一点,首先必须联接表,然后过滤条目,将它们分组,然后对它们进行排序。
因此,您的sql查询应该如下所示:
旁注:
使用
Specification
在这种情况下,这不是您想要做的,因为它们不代表完整的查询,而是在多个查询中使用的语句或查询的一部分。使用jpa criteriaquery:
因为我个人觉得criteriaquery很难阅读,而且不直观,所以可以使用querydsl作为替代方法。
使用querydsl: