微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JPQL查询以根据用户标识获取用户的所有角色

如何解决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 举报,一经查实,本站将立刻删除。