Spring Data JPA:查询ManyToMany

64

我有实体UserTest

@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创建的所有测试?

4个回答

118
以下方法签名将帮助您获得所需的内容:
List<Test> findByUsers_UserName(String userName)

这是使用Spring Data JPA的属性表达式功能。签名Users_UserName将被翻译为JPQL x.users.userName。请注意,这将对给定的用户名执行精确匹配。


2
如何在 JPQL 中制作这个(在 Query 注释中)? - Oleksandr H
可以使用join函数来实现。请看我的答案。 - ArslanAnjum
非常棒的解决方案,非常感谢!我已经搜索了一段时间。 - dave0688

14
我正在使用@JoinTable,通过以下方式使其工作:
@Query("select t from Test t join t.users u where u.username = :username")
List<Test> findAllByUsername(@Param("username") String username);

使用t.users u代替User u


12

其他答案展示了如何使用函数命名技术实现所需的功能。我们可以使用@Query注释来实现相同的功能,如下所示:

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

2
但为什么呢? - Kevin Van Dyck
1
@KevinVanDyck - 因为你需要在用户实体上放置条件,但是多对多关系没有定义为双向的,所以你必须从定义它的实体开始,即Test。 - GabiM

0

你也可以不使用下划线

List<Test> findByUsersUserName(String userName)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接