Java Hibernate-按子集合筛选子集合

Java Hibernate-按子集合筛选子集合,java,hibernate,jpa,Java,Hibernate,Jpa,我拥有以下实体: 页面组-包含页面 页面-位于页面组下方,具有访问角色 角色 我需要查询允许一个(或多个)选定角色的所有页面组。查询的页面组不能包含其所有页面。为页面组查询的所有页面必须具有选定的角色 我怎样才能意识到这一点?我想我必须使用@Filter,但不知道如何使用 数据库方案如下: 页面组列表: @Entity @Table(name = "PAGE_GROUP") public class PageGroup { @Id @Column(name = "pg_id"

我拥有以下实体:

  • 页面组-包含页面
  • 页面-位于页面组下方,具有访问角色
  • 角色
  • 我需要查询允许一个(或多个)选定角色的所有页面组。查询的页面组不能包含其所有页面。为页面组查询的所有页面必须具有选定的角色

    我怎样才能意识到这一点?我想我必须使用@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;
    }
    

    在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>....)
    
    从页面组中选择页面页面页面左侧加入页面左侧加入角色r
    其中r.id位于(……)
    

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

    1。需要添加“独特的”关键字。如果没有,则返回重复的页面组。2.不工作。返回的页面组包含可用于选定角色的页面。返回的
    PageGroups
    应至少包含一个具有指定角色的页面。确保你不是仅仅通过查看页面就懒得加载所有页面。事实上,如果您的关联是fetch lazy(默认情况下应该是这样),那么查询应该只返回没有附加任何内容的
    PageGroup
    对象。请记住,如果您试图检查实体的“内容”,即使调试器也会触发延迟加载。不知道为什么需要distinct,除非您使用的是本机查询。好的,对我们的数据尝试了类似的查询,是的,您确实需要distinct关键字。但是默认情况下,返回的
    PageGroup
    对象不应附加任何页面。不幸的是,如果希望
    PageGroup
    对象只附加匹配的
    Page
    对象,那么就没有标准的JPA方法来实现这一点。但是,Hibernate可以通过使用来实现这一点。您是否可以显示用于尝试实现查询的代码?
    @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
    }
    
    SELECT pg FROM PageGroup pg LEFT JOIN pg.pages p LEFT JOIN p.roles r
    WHERE r.id IN (....<list of Ids you want>....)