Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring数据JPA:查询多个_Java_Spring_Jpa_Spring Data_Spring Data Jpa - Fatal编程技术网

Java Spring数据JPA:查询多个

Java Spring数据JPA:查询多个,java,spring,jpa,spring-data,spring-data-jpa,Java,Spring,Jpa,Spring Data,Spring Data Jpa,我有实体User和Test @Entity public class User { private Long id; private String userName; } @Entity public class Test { private Long id; @ManyToMany private Set<User> users; } @实体 公共类用户{ 私人长id; 私有字符串用户名; } @实体 公开课考试{ 私人长id; @许多

我有实体
User
Test

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

@Entity
public class Test {
    private Long id;

    @ManyToMany
    private Set<User> users;
}
@实体
公共类用户{
私人长id;
私有字符串用户名;
}
@实体
公开课考试{
私人长id;
@许多
私人用户;
}
我可以按用户实体获取所有测试:

public interface TestRepository extends JpaRepository<EventSettings, Long> {
    List<Test> findAllByUsers(User user);
}
public interface TestRepository扩展了JpaRepository{
列出findAllByUsers(用户);
}

但是,通过
用户名
,我可以使用哪个查询来查找所有测试

以下方法签名将获得您想要的:

List<Test> findByUsers_UserName(String userName)
列出findByUsers\u用户名(字符串用户名)

这是使用Spring数据JPA的特性。签名
Users\u UserName
将被翻译成JPQL
x.UserName
。请注意,这将对给定用户名执行精确匹配。

以下方法签名将获得您想要的:

List<Test> findByUsers_UserName(String userName)
列出findByUsers\u用户名(字符串用户名)

这是使用Spring数据JPA的特性。签名
Users\u UserName
将被翻译成JPQL
x.UserName
。请注意,这将对给定的用户名执行精确匹配。

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

@Query("select t from Test t join User u where u.username = :username")
List<Test> findAllByUsername(@Param("username")String username);
@Query(“从测试t中选择t加入用户u,其中u.username=:username”)
列出findAllByUsername(@Param(“用户名”)字符串用户名);

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

@Query("select t from Test t join User u where u.username = :username")
List<Test> findAllByUsername(@Param("username")String username);
@Query(“从测试t中选择t加入用户u,其中u.username=:username”)
列出findAllByUsername(@Param(“用户名”)字符串用户名);

我在使用@JoinTable,我让它与以下内容一起工作:

@Query("select t from Test t join t.users u where u.username = :username")
List<Test> findAllByUsername(@Param("username") String username);
@Query(“从测试t中选择t,加入t.users u,其中u.username=:username”)
列出findAllByUsername(@Param(“用户名”)字符串用户名);

t.users u
而不是
User u

我使用了@JoinTable,我用它来处理这个问题:

@Query("select t from Test t join t.users u where u.username = :username")
List<Test> findAllByUsername(@Param("username") String username);
@Query(“从测试t中选择t,加入t.users u,其中u.username=:username”)
列出findAllByUsername(@Param(“用户名”)字符串用户名);

t.users u
而不是
User u

如何在JPQL(查询注释中)中实现此功能?可以使用join实现。看看我的答案。很棒的解决方案,非常感谢!已经搜索了一段时间。如何在JPQL(在查询注释中)中实现这一点?可以使用join实现。看看我的答案。很棒的解决方案,非常感谢!已经搜索了一段时间。但是为什么呢?@KevinVanDyck-因为您需要在用户实体上设置条件,但是多对多并没有定义为双向的,所以您必须从定义它的实体开始,但是为什么?@KevinVanDyck-因为你需要在用户实体上设置条件,但是多对多并没有定义为双向的,所以你必须从定义它的实体开始,即Test