SpringBoot数据JPA分组

问题描述 投票:0回答:1

我正在尝试使用 springboot jpa 规范通过查询执行组。但我面临错误。下面是我的代码。

public interface EmployeeRepo extends JpaRepository<Employee, Long>, JpaSpecificationExecutor<Employee> {
  
   default List<Employee> findAllActiveEmployee(String activeInd) {
     return findAll(filterByActiveAndGroupByGenderName);
   }
   
   private Specification<Employee> filterByActiveAndGroupByGenderName(String activeInd) {
     return (root, query, builder) -> {
        query.multiselect(List.of(root.get("name"), root.get("gender")));
        query.groupBy(root.get("name"), root.get("gender")));
        return builder.equal(root.get("activeInd"), activeInd);
     }; 
   }
} 

但是使用上面的代码,group by 被添加,但 select 中提供的列没有被附加,而是 Employee 类的整个列被添加并抛出“不是 GroupBy 表达式”错误。

我正在尝试 - 从员工中选择姓名、性别,其中 active_ind='Y' 按姓名、性别分组

java spring-boot
1个回答
0
投票

Spring Data JPA 规范是以类型安全的方式编写查询的好工具。然而,它并不适合所有情况。限制之一是它不支持使用

@Query
注释进行分组查询。

您可以通过使用“本机查询”和“投影”的组合来解决此问题。这是一个例子:

public interface EmployeeRepo extends JpaRepository<Employee, Long>, JpaSpecificationExecutor<Employee> {

    @Query(value = "SELECT new com.yourpackage.EmployeeDetails(e.name, e.gender) FROM Employee e WHERE e.activeInd = :activeInd GROUP BY e.name, e.gender")
    List<EmployeeDetails> findAllActiveEmployee(@Param("activeInd") String activeInd);

}

您需要创建由字段

EmployeeDetails
name
组成的
gender
投影。

package com.yourpackage;

public class EmployeeDetails {
    private final String name;
    private final String gender;

    public EmployeeDetails(String name, String gender) {
        this.name = name;
        this.gender = gender;
    }

    // getters
}

请注意,此方法仅适用于 JPQL 和 SQL(“本机查询”)。这是因为 Hibernate(位于 Spring JPA 之下)允许在

SELECT
子句中使用构造函数,然后将其转换为 ResultSet,然后将其转换为您需要的对象。

© www.soinside.com 2019 - 2024. All rights reserved.