更改Spring findBy*()的返回类型

svmlkihl  于 2023-03-02  发布在  Spring
关注(0)|答案(1)|浏览(126)

我有一个扩展CrudRepository的接口,我想把findByAge()的返回类型从Employee改为雇员的名字(String)。我该怎么做?我是否需要编写一个 Package 类来调用EmployeeRepository.findByAge(),从而提取名字?

@Repository
public interface EmployeeRepository extends CrudRepository<Employee, Long> {

    // change this to return a List<String> (List of employee name)
    List<Employee> findByAge(int age); 

}
5sxhfpxr

5sxhfpxr1#

查询注解

如果不想Map任何内容,可以使用@Query注解进行自己的查询。
它看起来像这样:

@Query( "SELECT e.name FROM Employee e where e.age = :age" )
List<String> findAllEmployeeNames(@Param("age") int age);

这将返回如下内容:

[ "Ann", "Tom" ]

基于界面的投影

或者如文档中的注解所述,可以使用基于接口的投影。
接口:

public interface NameOnly {
    String getName();
}

回购:

List<NameOnly> findByAge(int age);

这将返回如下内容:

[
    {
        "name": "Ann"
    },
    {
        "name": "Tom"
    }
]
  • 因此,这实际上并不像您要求的那样返回字符串列表。还要注意,如果您还想为Employee对象支持findByAge,这可能会在签名中产生歧义。您可以通过在函数名后面附加下划线来解决这种歧义,但通常我只会在您总是想将某个对象作为DTO返回,屏蔽一些成员(如db id)时使用此选项。*

Map

当然,您总是可以获取对象并将它们Map到控制器(/或服务)中。
它看起来像这样:

@GetMapping("/employees/{age}")
public List<String> getEmployeeNames(@PathVariable Integer age) {
    return employeeRepository.findByAge(age).stream().map(Employee::getName).toList();
}
  • 这将返回与第一个选项类似的字符串列表。*

相关问题