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

ma8fv8wu  于 2021-07-06  发布在  Java
关注(0)|答案(3)|浏览(373)

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

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", updatable = false, nullable = false)
    private Long id;

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinTable(
            name = "user_role",
            joinColumns = @JoinColumn(name = "user_id"),
            inverseJoinColumns = @JoinColumn(name = "role_id")
    )
    private Set<Role> roles = new HashSet<>();
}

角色类:

@Entity
public class Role {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", updatable = false, nullable = false)
    private Long id;

    private String name;
}

因此将创建一个新的联接表,名为:user\u role

我想创建一个查询,用于返回具有 role_id 例如,4。我已尝试的查询:

@Override
public List<User> getArtists() {
   return em.createQuery(
      "from User u, Role r where u.roles='4'",
      User.class
   ).getResultList();
}

如何修复此查询以检索具有 role_id 四分之一?

scyqe7ek

scyqe7ek1#

你可以这样做:

List<User> users = em.createQuery(
   "select distinct u from User u join fetch u.roles rl where rl.id = :id",
    User.class)
.setHint( QueryHints.HINT_PASS_DISTINCT_THROUGH, false )
.setParameter("id", 1L)
.getResultList();

这个 QueryHints.HINT_PASS_DISTINCT_THROUGH 作为额外的性能优化添加。但是请注意,这个优化只适用于Hibernate5.2.2.final。。。5.2.11.最终。它在5.2.12决赛中被打破了。

sg24os4d

sg24os4d2#

也许你可以看看下面的主题,里面给出的答案和你的问题指向的方向是一样的:连接表上的jpa查询

f3temu5u

f3temu5u3#

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

List<User> findByRoles_Id(Long id);

在用户存储库中:

public interface UserRepository extends JpaRepository<User, Long> {

    List<User> findByRoles_Id(Long id);
}

相关问题