我有以下实体:


页面组-包含页面。
页面-页面组下面的页面,具有访问角色。
角色。


我需要查询允许一个(或几个)所选角色的所有页面组。查询的页面组不能包含所有页面。为页面组查询的所有页面必须具有选定的角色。

我怎么能意识到这一点?想我必须使用@Filter但不知道如何。

数据库方案如下:


页面组列表:

@Entity
@Table(name = "PAGE_GROUP")
public class PageGroup {

    @Id
    @Column(name = "pg_id")
    private long id;
    @Column(name = "SOME_FIELD")
    private String field;
    @OneToMany(mappedBy = "group")
    private Set<Page> pages;
}


页面列表:

@Entity
@Table(name = "page")
public class Page {

    @Id
    @Column(name = "p_id")
    private long id;
    @Column(name = "some_field")
    private String field;
    @JoinColumn(name = "pg_id")
    @ManyToOne
    private PageGroup group;

    @ManyToMany
    @JoinTable
    private Set<Role> roles;
}


角色清单

@Entity
@Table(name = "role")
public class Role {

    @Id
    @Column(name = "r_id")
    private long id;

    @Column(name = "some_field")
    private Date field;
    //important: no Page reference
}

最佳答案

在JPQL中,您可以使用以下查询:

SELECT pg FROM PageGroup pg LEFT JOIN pg.pages p LEFT JOIN p.roles r
WHERE r.id IN (....<list of Ids you want>....)


这将返回PageGroup对象的列表,这些对象具有与由给定角色ID列表标识的角色相关联的页面。

07-24 09:34