Как избежать указания SQL-запроса в Spring Data JPA, когда атрибут поступает из другой таблицы

Я работаю с Spring Data JPA, и у меня есть следующие объекты: Страна: {country_id, country_name} Регион: {region_id, region_name, country_id}

От страны к региону существует множество взаимосвязей.

У меня есть JpaRepository для страны, и у меня есть следующий метод:

@Query("SELECT new org.example.CountryDTO(a.countryId, a.countryName, b.regionName ) FROM Country AS a left join Region AS lpd on a. countryId = r. countryId  WHERE a. countryId = LOWER(:country) and r.regionName= LOWER(:region) ”)
List<CountryDTO> find(@Param("country") String country, @Param("region") String region);

Вопрос в том, есть ли способ избежать необходимости указывать SQL-запрос? В идеале я бы хотел сделать что-то вроде:

List<CountryDTO> findByCountryAndRegionName(@Param("country") String country, @Param("region") String region);

Однако это кажется немного сложным, потому что столбец region_name взят из таблицы Region.

Кто-нибудь делал что-нибудь подобное? Вы могли бы предложить какое-нибудь изящное решение?

Любая помощь будет оценена!

Пожалуйста, переформатируйте свой вопрос: stackoverflow.com/editing-help#syntax-highlighting

Cepr0 08.06.2018 23:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
154
3

Ответы 3

Согласно документации, вы можете определять ограничения, просматривая вложенные свойства. См. 2.4.3 Выражения свойств

Предполагая, что у Country есть свойство regions, а у Country и Region есть свойства name, вы можете написать что-то вроде: List<Country> findByNameAndRegions_Name(String countryName, String regionName)

Привет @ sébastien-helbert Спасибо за ваше предложение. Вопрос к вам, нужно ли иметь один репозиторий для страны и один для региона? Я прошу вас об этом, потому что, поскольку все запросы, которые я буду создавать, относятся только к стране, в данный момент у меня нет репозитория для региона. Другой вопрос: работает ли это без отношений?

user1532449 11.06.2018 17:08

Если все запросы относятся только к стране, вам не нужен репозиторий региона. Что касается отношений, насколько я знаю, это не будет работать без отношений, потому что вложенные пути полагаются на имена отношений / полагаются на имена свойств.

Sébastien Helbert 13.06.2018 22:20

Похоже, вы можете вернуть List<Object[]>, если используете собственный запрос, как предлагается здесь.

Хотя я бы предпочел создать отдельный DTO, так как это другая проекция.

Я думаю, это должно сработать:

interface CountryProjection {
  String getCountryId();
  String getCountryName()
  String getRegionName()
}

и тогда ваш метод запроса может выглядеть так:

List<CountryProjection> findByCountryNameAndRegionRegionNameAllIgnoreCase(String country,String region);

Вы должны использовать Spring Data JPA 1.10 более поздней версии для поддержки проекции в методах запросов.

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