Метод запроса с перечислением и репозиторием JPA

#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.языки(имя атрибута)
  • Язык водителя не является сущностью