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

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

Существует много взаимосвязей между страной и регионом.

У меня есть JpaRepository for Country, и у меня есть метод, подобный следующему:

@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.

Кто-нибудь сделал что-нибудь подобное?Любое изящное решение, которое вы можете предложить?

Любая помощь будет принята с благодарностью!

Ответы [ 3 ]

0 голосов
/ 09 июня 2018

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

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

0 голосов
/ 09 июня 2018

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

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

, и тогда ваш метод запроса может выглядеть следующим образом:

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

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

0 голосов
/ 09 июня 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...