如何在 jpa 查询中加入具有 ManyToMany 关系的两个实体
How to join two entities with ManyToMany relationship in the jpa query
我有两个实体 User
和 Role
。每个用户可以有多个角色。
用户class
@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<>();
}
角色class:
@Entity
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", updatable = false, nullable = false)
private Long id;
private String name;
}
因此正在创建一个新加入的 table,名称为:user_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
为 4 的用户列表?
你可以这样做:
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
添加为额外的 performance optimization。但请注意,此优化仅适用于 hibernate 5.2.2.Final ... 5.2.11.Final。它在 5.2.12.Final.
中被破坏
如果我是你,我将受益于将 Spring data Jpa 与 hibernate 结合使用,并且只需使用以下语句:
如果你不想使用查询:
List<User> findByRoles_Id(Long id);
在您的用户存储库中:
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByRoles_Id(Long id);
}
我有两个实体 User
和 Role
。每个用户可以有多个角色。
用户class
@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<>();
}
角色class:
@Entity
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", updatable = false, nullable = false)
private Long id;
private String name;
}
因此正在创建一个新加入的 table,名称为:user_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
为 4 的用户列表?
你可以这样做:
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
添加为额外的 performance optimization。但请注意,此优化仅适用于 hibernate 5.2.2.Final ... 5.2.11.Final。它在 5.2.12.Final.
如果我是你,我将受益于将 Spring data Jpa 与 hibernate 结合使用,并且只需使用以下语句: 如果你不想使用查询:
List<User> findByRoles_Id(Long id);
在您的用户存储库中:
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByRoles_Id(Long id);
}