Java 如何在jpa查询中连接具有多个关系的两个实体

Java 如何在jpa查询中连接具有多个关系的两个实体,java,hibernate,jpa,jersey,Java,Hibernate,Jpa,Jersey,我有两个实体User和Role。每个用户可以有多个角色 用户类 @实体 公共类用户{ @身份证 @GeneratedValue(策略=GenerationType.IDENTITY) @列(name=“id”,updateable=false,nullable=false) 私人长id; @ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER) @可接合( name=“用户角色”, joinColumns=@JoinColumn(nam

我有两个实体
User
Role
。每个用户可以有多个角色

用户类

@实体
公共类用户{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“id”,updateable=false,nullable=false)
私人长id;
@ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@可接合(
name=“用户角色”,
joinColumns=@JoinColumn(name=“user\u id”),
inverseJoinColumns=@JoinColumn(name=“role\u id”)
)
私有集角色=新HashSet();
}
角色类别:

@实体
公共阶级角色{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“id”,updateable=false,nullable=false)
私人长id;
私有字符串名称;
}
因此,正在创建一个新的联接表,名为:user\u role

例如,我想创建一个查询,返回
role\u id
为4的用户列表。 我已尝试的查询:

@覆盖
公共列表getArtists(){
返回em.createQuery(
“来自用户u,角色r,其中u.roles='4'”,
用户类
).getResultList();
}

如何修复此查询以检索角色id为4的用户列表?

您可以执行以下操作:

List users=em.createQuery(
“从用户u中选择不同的u加入获取u.roles rl,其中rl.id=:id”,
用户(类)
.setHint(QueryHints.HINT\u PASS\u DISTINCT\u THROUGH,false)
.setParameter(“id”,1L)
.getResultList();

QueryHints.HINT\u PASS\u DISTINCT\u THROUGH
作为附加项添加。但请注意,此优化仅适用于hibernate 5.2.2.Final。。。5.2.11.最终版本。它在5.2.12.决赛中被打破了。

如果我是你,我将获得在hibernate中使用SpringdataJpa的好处,只需使用以下语句: 如果不想使用查询:

List<User> findByRoles_Id(Long id);
List findByRoles_Id(长Id);
在用户存储库中:

    public interface UserRepository extends JpaRepository<User, Long> {

    List<User> findByRoles_Id(Long id);
}
public interface UserRepository扩展了JpaRepository{
列出findByRoles_Id(长Id);
}

要澄清这一点,请使用SpringDataJPA,而不是JPAThanks@ACV:)