Я работаю с 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.
Кто-нибудь делал что-нибудь подобное? Вы могли бы предложить какое-нибудь изящное решение?
Любая помощь будет оценена!




Согласно документации, вы можете определять ограничения, просматривая вложенные свойства. См. 2.4.3 Выражения свойств
Предполагая, что у Country есть свойство regions, а у Country и Region есть свойства name, вы можете написать что-то вроде: List<Country> findByNameAndRegions_Name(String countryName, String regionName)
Привет @ sébastien-helbert Спасибо за ваше предложение. Вопрос к вам, нужно ли иметь один репозиторий для страны и один для региона? Я прошу вас об этом, потому что, поскольку все запросы, которые я буду создавать, относятся только к стране, в данный момент у меня нет репозитория для региона. Другой вопрос: работает ли это без отношений?
Если все запросы относятся только к стране, вам не нужен репозиторий региона. Что касается отношений, насколько я знаю, это не будет работать без отношений, потому что вложенные пути полагаются на имена отношений / полагаются на имена свойств.
Похоже, вы можете вернуть List<Object[]>, если используете собственный запрос, как предлагается здесь.
Хотя я бы предпочел создать отдельный DTO, так как это другая проекция.
Я думаю, это должно сработать:
interface CountryProjection {
String getCountryId();
String getCountryName()
String getRegionName()
}
и тогда ваш метод запроса может выглядеть так:
List<CountryProjection> findByCountryNameAndRegionRegionNameAllIgnoreCase(String country,String region);
Вы должны использовать Spring Data JPA 1.10 более поздней версии для поддержки проекции в методах запросов.
Пожалуйста, переформатируйте свой вопрос: stackoverflow.com/editing-help#syntax-highlighting