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:)