#java #spring-boot #jpa #spring-data-jpa
Вопрос:
У меня есть драйвер сущности и язык перечисления драйверов. Я хочу получить список драйверов, которые могут говорить на выбранном языке по параметру в методе репозитория.
... @Entity public class Driver{ private Long id; private firstName; @ElementCollection(targetClass = DriverLanguage.class) @Enumerated(EnumType.STRING) @CollectionTable(name = "driver_language", joinColumns = @JoinColumn(name = "driver_language_id")) @Column(name = "driver_language") private Setlt;DriverLanguagegt; languages = new HashSetlt;gt;(); } public enum DriverLanguage { ENGLISH, GERMAN }
Теперь я использую метод @Query.
Мой первый подход:
@Repository public interface DriverRepository extends JpaRepositorylt;Driver, Longgt; { @Query("SELECT d " "FROM Driver d " "JOIN DriverLanguage dl on d.id = dl.driver_language_id " "WHERE dl.driver_language = ?1") Listlt;Drivergt; findByLanguage(String language); } ERROR: Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join!
Затем я прочитал, что, возможно, мне не следует использовать JOIN, поэтому я попробовал это:
@Repository public interface DriverRepository extends JpaRepositorylt;Driver, Longgt; { @Query("SELECT d " "FROM Driver d, DriverLanguage dl " "WHERE d.id = dl.driver_language_id AND dl.driver_language = ?1") Listlt;Drivergt; findByLanguage(String language); } ERROR: Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: DriverLanguage is not mapped
Чего мне здесь не хватает?
Ответ №1:
Прямым JPQL-запросом может быть
@Repository public interface DriverRepository extends JpaRepositorylt;Driver, Longgt; { @Query("SELECT d " "FROM Driver d " "WHERE ?1 MEMBER OF d.languages") Listlt;Drivergt; findByLanguage(DriverLanguage language); }
Сообщения об ошибках, которые сообщают вам мессаеги:
- путь-d.языки(имя атрибута)
- Язык водителя не является сущностью