Собственный запрос в JPA с классом Random Entity - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь понять использование nativeQuery с данными пружины JPA. Подумайте над тем, где я вытаскиваю USER_NAME из таблицы USER.

открытый интерфейс UserRepository расширяет JpaRepository {

  @Query(value = "SELECT USER_NAME FROM USER WHERE EMAIL_ADDRESS = ?1", nativeQuery = true)
  String findByEmailAddress(@Param("emailAddress") String emailAddress );
}

Все хорошо. Теперь на том же интерфейсе я могу добавить метод, как показано ниже, где он извлекается из SOME_OTHER_TABLE и не будет соответствовать классу сущности User.

@Query(value = "SELECT USER_NAME FROM SOME_OTHER_TABLE WHERE EMAIL_ADDRESS = ?1", nativeQuery = true)
  String findByEmailAddress(@Param("emailAddress") String emailAddress );
}

Это тоже отлично работает. Теперь мой реальный вопрос: зачем нам нужен User класс сущностей, если он не имеет ничего общего с native query. Мы просто пытаемся убедиться, что код будет правильно компилироваться? Также это означает, что я могу даже поставить любой класс entity, например JpaRepository<SOmeRandomEntityClass, Long>, и он все равно будет работать.

Ответы [ 2 ]

1 голос
/ 28 июня 2019

Собственные запросы предназначены для угловых случаев, когда объектно-ориентированный подход, предлагаемый jpa, недостаточно гибок.Нативный запрос - это просто запрос SQL, и он не может использовать структуру вашего объекта.

Чтобы ответить на ваш вопрос, да, вы можете технически добавить этот запрос в любой репозиторий.Встроенная поддержка запросов в репозиториях позволяет расширить функциональность вашего репозитория с помощью произвольного кода SQL.

Обратите внимание, что если вы установите native = false, вы сможете использовать запросы jpql, которые позволяют вам использовать вашу структуру сущностей в вашихзапросы.Обратите внимание, что вы можете полностью опустить аннотацию @query, если измените тип возвращаемого значения на List.Spring реализует метод автоматически.(Предполагается, что emailAddress является собственностью пользователя)

1 голос
/ 28 июня 2019

Использование собственных запросов делает ненужным использование сущностей, вы можете поместить любой запрос, который работает, например, с SqlDeveloper, но, с моей точки зрения, это противоречит философии JPA.

Надежная структура доступа к данным, которая работает независимо от СУБД.

Нативная позволит вам, например, использовать собственные функции MySQL или Oracle, но при миграции из СУБД вам придется проверять все собственные запросы.

Однако с именованными запросами или Criteria Builder вы будете использовать разрешенные функции или разрешенные методы, которые будут теми, которые вы можете использовать во всех СУБД

Для этого вы должны использовать именованные запросы или CriteriaBuilder, для чего вам нужны и сущности, и ваша метамодель

...