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