Spring Data JPA:查询多对多
Posted
技术标签:
【中文标题】Spring Data JPA:查询多对多【英文标题】:Spring Data JPA: query ManyToMany 【发布时间】:2016-01-31 00:37:51 【问题描述】:我有实体 User
和 Test
@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
的所有测试?
【问题讨论】:
【参考方案1】:下面的方法签名会得到你想要的:
List<Test> findByUsers_UserName(String userName)
这是使用 Spring Data JPA 的 property expression 功能。签名 Users_UserName
将被转换为 JPQL x.users.userName
。请注意,这将对给定的用户名执行完全匹配。
【讨论】:
如何在 JPQL 中(在查询注释中)进行此操作? 可以通过join来实现。看我的回答。 很棒的解决方案,非常感谢!找了一阵子。【参考方案2】:其他答案显示了如何使用函数命名技术实现所需的功能。我们可以使用@Query 注解实现相同的功能,如下所示:
@Query("select t from Test t join User u where u.username = :username")
List<Test> findAllByUsername(@Param("username")String username);
【讨论】:
但是为什么呢? @KevinVanDyck - 因为您需要将条件放在用户实体上,但多对多未定义为双向,因此您必须从定义它的实体开始,即。测试【参考方案3】:我正在使用@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
【讨论】:
以上是关于Spring Data JPA:查询多对多的主要内容,如果未能解决你的问题,请参考以下文章