0

我正在为我的项目任务使用 AngularJS 和 Spring Boot 技术,而且我是 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;

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

4

1 回答 1

0

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

员工类

@Entity
@Getter
@Setter
public class Employee {

    @Id
    private Long id;

    @Column
    private String name;

    @Column
    private int age;

    @ManyToOne
    private Company company;
}

公司类

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

    @Column
    private String name;

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

一个简单的 POJO 类 (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。

于 2018-03-08T10:09:17.390 回答