【问题标题】:Spring Data query by nested collection method signature通过嵌套集合方法签名的 Spring Data 查询
【发布时间】:2018-01-07 17:54:26
【问题描述】:

我有用户和角色实体。它们之间存在多对多的关系。如何定义存储库方法以查找具有指定角色的所有用户?我试过findByRolesContainingfindByRolesContains,但似乎都不起作用。

我需要使用本机查询还是可以使用方法声明?

User实体

@Entity
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @Column(nullable = false, unique = true)
    private String username;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(
            name = "user_role",
            joinColumns = @JoinColumn(name = "user_id"),
            inverseJoinColumns = @JoinColumn(name = "role_id")
    )
    private Collection<Role> roles;

    private String firstName;

    private String lastName;

    private String password;

    private boolean enabled;

    // getters and setters ...
}

Role实体

@Entity
public class Role {

    public static final String SUPER_ADMIN = "SUPER_ADMIN";

    public static final String PROJECT_MANAGER = "PROJECT_MANAGER";

    public static final String DEVELOPER = "DEVELOPER";

    public static final String CLIENT = "CLIENT";

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;

    @ManyToMany(mappedBy = "roles")
    private Collection<User> users;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(
            name = "role_privilege",
            joinColumns = @JoinColumn(name = "role_id"),
            inverseJoinColumns = @JoinColumn(name = "privilege_id")
    )
    private Collection<Privilege> privileges;

    public Role() {

    }

    public Role(String name) {

        this.name = name;
    }

    public Long getId() {

        return id;
    }

    public void setId(Long id) {

        this.id = id;
    }

    public String getName() {

        return name;
    }

    public void setName(String name) {

        this.name = name;
    }

    public Collection<User> getUsers() {

        return users;
    }

    public void setUsers(Collection<User> users) {

        this.users = users;
    }

    public Collection<Privilege> getPrivileges() {

        return privileges;
    }

    public void setPrivileges(Collection<Privilege> privileges) {

        this.privileges = privileges;
    }
}

我的UserRepository 接口需要一个方法,例如 List&lt;User&gt; findByRole(Role role); 这将返回具有参数中指定角色的所有用户(包含在 User.roles 集合中。

【问题讨论】:

  • 你能分享你的代码吗?
  • 为什么不找到角色,这样你就可以得到Collection&lt;User&gt;,我的意思是Role findByName(String roleName);,那么你可以使用List&lt;User&gt; users = findByName("roleName").getUsers();

标签: java spring spring-data spring-repositories


【解决方案1】:

我相信只需findByRoles 就足够了。

我还建议您在遇到方法名称问题时使用带有 JPQL 的 @Query 注释。

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.at-query

【讨论】:

    猜你喜欢
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    相关资源
    最近更新 更多