Spring-具有聚合功能的数据-JPA规范
Spring-Data-JPA Specification with Aggregate function
我们如何使用规范编写以下查询
SELECT e.id, e.name, count(e.id)
FROM Employee e INNER JOIN Department d
WHERE e.id = d.empId;
当我们使用Specification时,即使在multiselect中提到它也没有选择count()。
知道如何在我们使用 JPA findAll 方法时在规范中包含计数列。
尝试使用多选,但当它传递给规范时,它只查询非聚合列。
Expression<Long> countExp = cb.count(root.get("id"));
CriteriaQuery<Employee> select =
criteriaQuery.multiselect(root.get("id"), root.get("name"), countExp);
但它会生成如下查询:
SELECT e.id, e.name
FROM Employee e INNER JOIN Department d
WHERE e.id = d.empId;
似乎遇到与以下问题相同的问题:
JpaSpecificationExecutor : complex queries with specifications
Why the multiselect method in JPA does not work
为了解决上述问题,创建了自己的 JPARepository 实现并覆盖了 SimpleJpaRepository 的 getQuery 方法
private TypedQuery<Employee> getQuery(Specification<Employee> spec, Sort sort) {
CriteriaBuilder builder = this.em.getCriteriaBuilder();
CriteriaQuery<Employee> query = builder.createQuery(Employee.class);
Root<Employee> root = this.applySpecificationToCriteria(spec, query);
query.multiselect(root.get("id"), root.get("name"),
builder.count(root.get("id")).alias("count"));
if (sort != null) {
query.orderBy(QueryUtils.toOrders(sort, root, builder));
}
return this.em.createQuery(query);
}
我们如何使用规范编写以下查询
SELECT e.id, e.name, count(e.id)
FROM Employee e INNER JOIN Department d
WHERE e.id = d.empId;
当我们使用Specification时,即使在multiselect中提到它也没有选择count()。
知道如何在我们使用 JPA findAll 方法时在规范中包含计数列。
尝试使用多选,但当它传递给规范时,它只查询非聚合列。
Expression<Long> countExp = cb.count(root.get("id"));
CriteriaQuery<Employee> select =
criteriaQuery.multiselect(root.get("id"), root.get("name"), countExp);
但它会生成如下查询:
SELECT e.id, e.name
FROM Employee e INNER JOIN Department d
WHERE e.id = d.empId;
似乎遇到与以下问题相同的问题: JpaSpecificationExecutor : complex queries with specifications
Why the multiselect method in JPA does not work
为了解决上述问题,创建了自己的 JPARepository 实现并覆盖了 SimpleJpaRepository 的 getQuery 方法
private TypedQuery<Employee> getQuery(Specification<Employee> spec, Sort sort) {
CriteriaBuilder builder = this.em.getCriteriaBuilder();
CriteriaQuery<Employee> query = builder.createQuery(Employee.class);
Root<Employee> root = this.applySpecificationToCriteria(spec, query);
query.multiselect(root.get("id"), root.get("name"),
builder.count(root.get("id")).alias("count"));
if (sort != null) {
query.orderBy(QueryUtils.toOrders(sort, root, builder));
}
return this.em.createQuery(query);
}