当前位置: 首页 > 知识库问答 >
问题:

带有聚合函数的Spring-Data-JPA规范

王泓
2023-03-14

如何使用规范编写下面查询

SELECT e.id, e.name, count(e.id) 
FROM Employee e INNER JOIN Department d
WHERE e.id = d.empId;

当我们使用Specification时,即使在multiselect中提到了count(),也没有选择count()。

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;

为什么JPA中的multiselect方法不起作用

共有1个答案

卢出野
2023-03-14

为了解决上述问题,创建了自己的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);
    }
 类似资料:
  • 我正在使用查询DSL的Spring数据JPA,并试图在条件中使用求和函数,因为我正在使用分页,所以我必须首先获得计数。所以我有如下的Java代码:- 它创建这样的查询:- 我得到。 上述查询在中也不起作用,因为sum函数不能与count-in-where条件一起使用。当我必须先进行计数,然后再获取真实数据时,我不知道如何处理这样的问题。有人能帮我解决这个问题的方法吗。 请不要建议注释,因为我不能使

  • 我有两个表:收入和支出,我在其中存储所有收入和支出交易,目前这两个表之间没有关系。 目前,我使用Spring Data JPA的规范功能在单个实体上执行此操作: 费用:

  • 现在挣扎着与first存在,因为它已经加入了。有没有办法用规范来做到这一点。也因为有两个存在,这是否意味着我需要两个规范。我能在一个规范中实现它吗。

  • 问题内容: 这是我正在尝试使用Spring Data JPA实现类似解决方案的代码。 CustomerDbConfig.java(第一个数据源连接) CustomerDbConfig.java(第二个数据源) Order.java(模型) … CustomerRepository.java 最后,Application.java 在启动过程中会引发以下异常: 预先感谢你的帮助。 问题答案: 通过使

  • 声明使用输入参数属性作为查询参数的Spring data JPA查询的最简单方法是什么? ...但Spring data/JPA不喜欢我在参数上指定属性名。 最合适的选择是什么?

  • 有一个使用属性表达式的查询:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-方法。查询属性表达式: 试图通过规范执行查询: 我得到了一个错误: 我做错了什么或忘记添加了什么? 查询:按教师姓名显示所有学生 基地实体: 实体教师: 实体学生: 实体教室: 实体教室: