Как получить ответ объекта массива в аннотации @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 в ваших классах контроллера / обслуживания.

Другие вопросы по тегам