2015-10-30 5 views
14

У меня есть объекты User и TestSpring Data JPA: запрос ManyToMany

@Entity 
public class User { 
    private Long id; 
    private String userName; 
} 

@Entity 
public class Test { 
    private Long id; 

    @ManyToMany 
    private Set<User> users; 
} 

я могу получить все тесты на пользователя объекта:

public interface TestRepository extends JpaRepository<EventSettings, Long> { 
    List<Test> findAllByUsers(User user); 
} 

Но какой запрос я могу использовать для поиска всех тестов по userName ?

ответ

37

Следующий метод подпись получит вы хотите хотите:

List<Test> findByUsers_UserName(String userName) 

Это использует property expression особенности Spring Data JPA. Подпись Users_UserName будет переведена на JPQL x.users.userName. Обратите внимание, что это будет выполнять точное совпадение по данному имени пользователя.

+1

Как это сделать в JPQL (в аннотации запроса)? –

+0

это может быть достигнуто с помощью соединения. см. мой ответ. – ArslanAnjum

+0

Удивительное решение, спасибо большое! Некоторое время искал. – dave0688

0

Другой ответ показывает, как достичь желаемой функциональности, используя технику именования функций. Мы можем достичь такой же функциональности, используя аннотацию @Query следующим образом:

@Query("select t from Test t join User u where u.username = :username") 
List<Test> findAllByUsername(@Param("username")String username); 
+0

Но почему же? –

Смежные вопросы