【问题标题】:JpaRepository find User with Role in list of rolesJpaRepository 在角色列表中查找具有角色的用户
【发布时间】:2017-02-08 13:03:27
【问题描述】:

我将SpringHibernateJpaRepository 一起用作数据库存储库。

我有两个用于用户存储的类:

@Entity
public class User {
    @Id
    private Long id;

    private String username;

    private String password;

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
    private List<UserRole> roles;
}

@Entity
public class UserRole {
    @Id
    private Long id;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;

    @Enumerated(EnumType.STRING)
    private Role role;
}

public enum Role {
    ADMIN,
    MEMBER;
    /* some others in the future */
}

如您所见,User 可以分配多个角色。所以user1 可以拥有ADMINMEMBER 角色,而user2 只能拥有MEMBER 角色。

我想拥有ADMIN 角色的用户(以及其他角色)可以列出数据库中的所有用户(JpaRepositoryfindAll() 方法就足够了)但只有MEMBER 角色的用户只能列出MEMBER 的用户角色。

如何在JpaRepository 中编写方法来实现?我在下面尝试了一些,但它不起作用:

List<User> findByRoles_RoleIn(Collection<Role> roles);

List<User> findByRoles_Role(Role role);

也许是一些自定义的@Query

【问题讨论】:

    标签: java spring hibernate spring-data-jpa spring-repositories


    【解决方案1】:

    如果您可以进行自定义查询,请尝试以下操作:

    @Query( "select u from User u inner join u.roles r where r.role in :roles" )
    List<User> findBySpecificRoles(@Param("roles") List<Role> roles);
    

    【讨论】:

    • 感谢您的回答,但它并没有真正发挥应有的作用。当每个用户具有适合 List 的多个角色时,我会得到重复的条目。如何解决?
    • 这种情况下需要在select后加上'distinct'
    • ok 'distinct' 对此有所帮助,但我发现了另一个问题,我认为这么简单还不够。当我将 MEMBER 作为参数传递时,我应该得到只有 MEMBER 角色的用户列表,现在我得到了具有 MEMBER 和 ADMIN 角色的用户。我尝试将查询反向查询到“[...] not in :roles”并将 ADMIN 作为参数传递,但它也不起作用。
    • 尝试将参数放在括号中.. (:roles)
    • 测试成功了吗?
    【解决方案2】:

    如果你不想使用@query

    按角色对象查询

    List<User> findByRoles_(Role role);
    

    按角色对象id查询

    List<User> findByRoles_Id(Long id);
    

    【讨论】:

      【解决方案3】:

      对于这种情况,您需要使用自定义 jpql 查询。并使用自定义查询实现两种方法,一种用于管理员,一种用于简单用户。 类似的东西

      @Query("SELECT u FROM User u JOIN u.roles r WHERE r.role=:rolename")

      【讨论】:

        【解决方案4】:

        如果您想在 JPA 中检索具有角色名称列表的用户,您可以在存储库中添加以下方法。

        List<User> findByRoles_NameIn(List<String> roles);
        

        【讨论】:

          猜你喜欢
          • 2020-06-02
          • 2017-11-02
          • 1970-01-01
          • 2022-12-12
          • 2014-07-16
          • 2019-10-19
          • 1970-01-01
          • 1970-01-01
          • 2017-09-10
          相关资源
          最近更新 更多