如何解决JPQL查询以根据用户标识获取用户的所有角色
在我的项目中,用户和角色之间存在多对多关系。因此,我还有一个新实体next()
,它将这两个实体连接起来。
它看起来像这样:
用户:
UserRole
角色:
@Data
@Entity
@Table(NAME = "USERS")
public class User {
@Id
@Column(name = "USER_ID")
private String userId;
@Basic
@Column(name = "EMAIL")
private String email;
@OnetoMany(fetch = LAZY,mappedBy = "user")
private Set<UserRole> userRoles;
}
UserRole:
@Data
@Entity
@Table(NAME = "ROLES")
public class Role {
@Id
@Column(name = "ROLE_ID")
private String roleId;
@Basic
@Column(name = "NAME")
private String name;
@OnetoMany(fetch = LAZY,mappedBy = "role")
private Set<UserRole> userRoles;
}
问题:如何使用一个查询(JPQL)通过其ID(userId)和所有分配给他的角色来获取用户?
我知道我首先可以通过id来获取User,然后我可以根据UserRole表分别获取Roles。
解决方法
您可以使用fetch
关键字:
@Query(
"select u " +
"from User u " +
"left join fetch u.userRoles "+
"where u.userId = :id "
)
List<User> getUsersByIdAndRoles(@Param("id") String id)
,
我建议您通过以下方式更正映射:
@Data
@Entity
@Table(NAME = "USERS")
public class User {
@Id
@Column(name = "USER_ID")
private String userId;
@Column(name = "EMAIL")
private String email;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "USER_ROLES",joinColumns = @JoinColumn(name = "USER_ID"),inverseJoinColumns = @JoinColumn(name = "ROLE_ID"))
private Set<Role> roles;
}
@Data
@Entity
@Table(NAME = "ROLES")
public class Role {
@Id
@Column(name = "ROLE_ID")
private String roleId;
@Column(name = "NAME")
private String name;
@ManyToMany(fetch = FetchType.LAZY,mappedBy = "roles")
private Set<User> users;
}
此更正将不会影响仅数据库架构的休眠映射。 然后,您将可以按照 Andronicus 答案中的建议进行操作:
@Query(
"select u " +
"from User u " +
"left join fetch u.roles "+
"where u.userId = :id "
)
List<User> getUsersWithFetchedRoles(@Param("id") String id)
如果您继续使用当前的映射,那么您一次将无法获取多个关联,如this文章中所述。
与@ManyToMany
关联相关的其他详细信息,请参见documentation。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。