JPA2(JPQL) 中的 ManyToMany select 查询
ManyToMany select query in JPA2(JPQL)
我有两个表:多对多关系中的用户和角色。
@Entity
@Table(name = "user")
public class User implements Serializable {
@Id
@Column(name = "user_id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long userId;
@ManyToMany
@JoinTable(name = "user_role",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles;
//getters, setters
}
和
@Entity
@Table(name = "role")
public class Role implements Serializable {
@Id
@Column(name = "role_id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long roleId;
@Column(name = "role_code")
private String roleCode;
@ManyToMany(mappedBy = "roles")
@JsonIgnore
private Set<User> users;
//getters,setters
}
我想要 select 所有用户和所有他的角色,如果用户有角色,例如 'ROLE_USER'。
我是用原生 sql 做的,但我想使用 JPQL 或 CriteriaQuery。
我在 JPQL 中尝试过(将早期的抓取类型更改为 EAGER,因为在子查询中我无法使用联合抓取):
public List<User> findUsersByRole(String roleName, int startNumber, int endNumber) {
Query q = em.createQuery("select u from User u join fetch u.roles r WHERE u.userId in (SELECT uu.userId FROM User uu join uu.roles rr WHERE rr.roleCode like :roleName)")
.setParameter("roleName", roleName)
.setFirstResult(startNumber)
.setMaxResults(endNumber);
return q.getResultList();
}
它可以正常工作,但是否可以不将 Fetching 类型更改为 EAGER?
感谢您的回复。
你可以这样做:
public List<User> findUsersByRole(String roleName, int startNumber, int endNumber) {
Query q = em.createQuery("select u from User u join fetch u.roles join u.roles r WHERE r.roleCode like :roleName")
.setParameter("roleName", roleName)
.setFirstResult(startNumber)
.setMaxResults(endNumber);
return q.getResultList();
}
我有两个表:多对多关系中的用户和角色。
@Entity
@Table(name = "user")
public class User implements Serializable {
@Id
@Column(name = "user_id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long userId;
@ManyToMany
@JoinTable(name = "user_role",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles;
//getters, setters
}
和
@Entity
@Table(name = "role")
public class Role implements Serializable {
@Id
@Column(name = "role_id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long roleId;
@Column(name = "role_code")
private String roleCode;
@ManyToMany(mappedBy = "roles")
@JsonIgnore
private Set<User> users;
//getters,setters
}
我想要 select 所有用户和所有他的角色,如果用户有角色,例如 'ROLE_USER'。
我是用原生 sql 做的,但我想使用 JPQL 或 CriteriaQuery。
我在 JPQL 中尝试过(将早期的抓取类型更改为 EAGER,因为在子查询中我无法使用联合抓取):
public List<User> findUsersByRole(String roleName, int startNumber, int endNumber) {
Query q = em.createQuery("select u from User u join fetch u.roles r WHERE u.userId in (SELECT uu.userId FROM User uu join uu.roles rr WHERE rr.roleCode like :roleName)")
.setParameter("roleName", roleName)
.setFirstResult(startNumber)
.setMaxResults(endNumber);
return q.getResultList();
}
它可以正常工作,但是否可以不将 Fetching 类型更改为 EAGER? 感谢您的回复。
你可以这样做:
public List<User> findUsersByRole(String roleName, int startNumber, int endNumber) {
Query q = em.createQuery("select u from User u join fetch u.roles join u.roles r WHERE r.roleCode like :roleName")
.setParameter("roleName", roleName)
.setFirstResult(startNumber)
.setMaxResults(endNumber);
return q.getResultList();
}