如何在 Spring 中的@Query 注释中获取数组对象响应

How to get an array object response in @Query annotation in Spring

我正在为我的项目任务使用 AngularJS 和 Spring 引导技术,我是 Spring 的新手。我在我的 Spring 存储库中使用 @Query 注释和 nativeQuery=true,我想获得一个对象数组响应。

响应示例:

[{id: 1, name: "John Michael", age: 19, company_position: "Programmer"}]

这是我的查询示例:

SELECT q.id, q.name, q.age, w.company_position FROM employee q, company w WHERE q.id=w.emp_id;

如何在Spring中的@Query注释中获取数组对象响应?

这里有两个例子。在加载实体时,将数据复制到 DTO。在第二个示例中,使用预测查询来最小化数据加载和复制。我已将原始查询更改为 select 公司名称,因为它不会存储在公司 table 中的职位。 Lombok 注释用于创建 getter/setter 和构造函数。

员工class

@Entity
@Getter
@Setter
public class Employee {

    @Id
    private Long id;

    @Column
    private String name;

    @Column
    private int age;

    @ManyToOne
    private Company company;
}

公司class

@Entity
@Getter
@Setter
public class Company {
    @Id
    private Long id;

    @Column
    private String name;

    @OneToMany(cascade = CascadeType.ALL)
    private List<Employee> employees;
}

一个简单的 POJO class (DTO) 以我们想要的方式生成 JSON。

@Data
@AllArgsConstructor
public class EmployeeAndCompanyDTO {

    String name;
    int age;
    String companyName;
}

Spring 数据存储库

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

}

示例休息控制器

@RestController
public class EmployeeController {

    @Autowired
    EmployeeRepository employeeRepository;

    @ResponseBody
    public List<EmployeeAndCompanyDTO> employeeAndCompanyView() {
        List<Employee> employee = employeeRepository.findAll();
        return employee.stream()
                .map(e-> new EmployeeAndCompanyDTO(e.getId(), e.getName(), e.getAge(), e.getCompany().getName()))
                .collect(Collectors.toList());
    }
}   

如果您想避免加载所有数据,而只加载您需要的列,您可以在存储库中使用自定义投影查询:

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

    @Query("select new com.example.EmployeeAndCompanyDTO(e.id, e.name, e.age, e.company.name) from Employee e")
    List<EmployeeAndCompanyDTO> employeeAndCompanyView();

}

编写投影查询有点棘手(取决于您的 IDE 支持),但您加载的数据较少,并且您不需要从实体转换为 DTO controller/service classes.