#java #spring-boot #spring-data-jpa #spring-data
Вопрос:
Я довольно новичок в Spring Boot. Я пытаюсь объединить несколько таблиц и получить некоторые данные обратно. Я создал сущности и репозитории для трех таблиц, с которыми я работаю. Запрос, с которым я работаю, объединяет все три таблицы. Мой первый вопрос
- Поскольку запрос объединяет все три таблицы, в каком классе репозитория я должен сохранить этот метод?
- Запрос не заблокирован. Поддерживает ли это JQL?
- У меня есть три объекта 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.
Просто чтобы пролить свет на ваши вопросы,
- Вы должны создать репозиторий Spring Data JPA
Employee
. Но два других остаютсяEntity
. Репозитории в основном представляют собой набор совокупных корней, которые, в свою очередь, являются некоторыми из ваших объектов, к которым вы будете обращаться и которые накладывают бизнес-ограничения на других. Например., ВыEmployee
состоите изEmployeePosition
,Employee
быть совокупным корнем, поскольку он управляет жизненным цикломEmployeePosition
etc. Следовательно, вы должны определить репозиторий для сотрудника, но не дляEmployeePosition
. Так что это далеко не все объекты, для которых вы бы создавали репозитории. - Вы можете использовать
@Transactional(isolation = Isolation.READ_UNCOMMITTED)
. Но это на уровне транзакции. Использование@NativeQuery
такого типа материалов безопаснее, чем на уровне базы данных. - Поскольку у вас есть все отношения, определенные в
Entity
so, теперь вы можете напрямую использовать методы запроса JPA для извлечения данных. Для этого можно использовать производный запрос. Что-то вроде
List<Employee> findByEmployeePositionAndEmployeeActionAndStatus(EmployeePosition position, EmployeeAction action, String status)