我正在尝试使用 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' 按姓名、性别分组
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,然后将其转换为您需要的对象。