如何在 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.
我正在为我的项目任务使用 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.