Как получить ответ объекта массива в аннотации @Query в Spring
Я работаю с технологиями AngularJS и Spring Boot для выполнения моих проектных задач, и я новичок в Spring. я использую @Query
аннотация с nativeQuery=true
в моем репозитории Spring, и я хочу получить ответ от массива объектов.
Пример ответа:
[{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
аннотация весной?
1 ответ
Вот два примера. В сущности загружается, а данные копируются в DTO. Во втором примере предварительный запрос используется для минимизации загрузки и копирования данных. Я изменил исходный запрос, чтобы выбрать название компании, так как он больше не сохраняет занятость в таблице компаний. Аннотации Lombok используются для создания методов получения / установки и конструкторов.
Класс сотрудника
@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 Data репозиторий
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
}
Пример Rest Controller
@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 в ваших классах контроллера / обслуживания.