Объединение нескольких таблиц в Spring Data JPA (Spring Boot 2)

#java #spring-boot #spring-data-jpa #spring-data

Вопрос:

Я довольно новичок в Spring Boot. Я пытаюсь объединить несколько таблиц и получить некоторые данные обратно. Я создал сущности и репозитории для трех таблиц, с которыми я работаю. Запрос, с которым я работаю, объединяет все три таблицы. Мой первый вопрос

  1. Поскольку запрос объединяет все три таблицы, в каком классе репозитория я должен сохранить этот метод?
  2. Запрос не заблокирован. Поддерживает ли это JQL?
  3. У меня есть три объекта Employee.java , Должность сотрудника.java и EmployeeAction.java .

Ниже приведен SQL-запрос (собственный запрос), с которым я работаю. Можно ли преобразовать его в язык запросов Spring Data JPA из собственного запроса?

 SELECT
           A.EMPL_ID
         , A.HIRE_DT
FROM
           HR.EMPLOYEE A WITH(NOLOCK)
           INNER JOIN
                      HR.EMPLOYEE_POS B WITH(NOLOCK)
                      ON
                                 A.SEQ_NO = B.SEQ_NO
           INNER JOIN
                      HR.EMPLOYEE_ACN C WITH(NOLOCK)
                      ON
                                 A.SEQ_NO = C.SEQ_NO
WHERE
           A.EMPLOYEE_STATUS in ('ACTIVE')
           AND B.JOB_GRP='IT'
           AND C.ACN IN ('HIRE')
ORDER BY
           A.HIRE_DT ASC
 

Ответ №1:

Я настоятельно рекомендую использовать @Query or @ Native Query для решения проблем такого типа в Spring Data JPA.

Просто чтобы пролить свет на ваши вопросы,

  1. Вы должны создать репозиторий Spring Data JPA Employee . Но два других остаются Entity . Репозитории в основном представляют собой набор совокупных корней, которые, в свою очередь, являются некоторыми из ваших объектов, к которым вы будете обращаться и которые накладывают бизнес-ограничения на других. Например., Вы Employee состоите из EmployeePosition , Employee быть совокупным корнем, поскольку он управляет жизненным циклом EmployeePosition etc. Следовательно, вы должны определить репозиторий для сотрудника, но не для EmployeePosition . Так что это далеко не все объекты, для которых вы бы создавали репозитории.
  2. Вы можете использовать @Transactional(isolation = Isolation.READ_UNCOMMITTED) . Но это на уровне транзакции. Использование @NativeQuery такого типа материалов безопаснее, чем на уровне базы данных.
  3. Поскольку у вас есть все отношения, определенные в Entity so, теперь вы можете напрямую использовать методы запроса JPA для извлечения данных. Для этого можно использовать производный запрос. Что-то вроде

List<Employee> findByEmployeePositionAndEmployeeActionAndStatus(EmployeePosition position, EmployeeAction action, String status)