Hibernate 在JPA中,我该如何说,给我一个集合字段在另一个列表中至少有一个项的所有对象?

Hibernate 在JPA中,我该如何说,给我一个集合字段在另一个列表中至少有一个项的所有对象?,hibernate,jpa,criteria,jpa-2.1,Hibernate,Jpa,Criteria,Jpa 2.1,我有以下字段的JPA实体: @manytomy @JoinTable(name=“用户\组织”, joinColumns={@JoinColumn(name=“USER_ID”)}, inverseJoinColumns={@JoinColumn(name=“ORGANIZATION\u ID”)} @LazyCollection(LazyCollectionOption.FALSE) @自然的 私有SortedSet organizations=新树集(); 给定一个组织对象(myORG)列

我有以下字段的JPA实体:

@manytomy
@JoinTable(name=“用户\组织”,
joinColumns={@JoinColumn(name=“USER_ID”)},
inverseJoinColumns={@JoinColumn(name=“ORGANIZATION\u ID”)}
@LazyCollection(LazyCollectionOption.FALSE)
@自然的
私有SortedSet organizations=新树集();
给定一个
组织
对象(myORG)列表,并使用CriteriaBuilder,如何编写一个子句来说明:

给我所有
用户
对象,其中至少有一个
组织
myOrgs
变量

我尝试了以下方法,但没有成功

final CriteriaBuilder=m_entityManager.getCriteriaBuilder();
最终准则查询准则=builder.createQuery(User.class);
最终根用户根=criteria.from(User.class);
其中(builder.isMember(myOrgs,userRoot.get(User.organizations))。。。

我将JPA 2.1与Hibernate 4.3.6.Final一起使用。

早上好,我将尝试以下方法:

//GET A LIST OF IDS
List<Long> orgsIds = new ArrayList<>();
for (Organization org : myOrgs){
    orgsIds.add(org.getId());
}

//CREATE QUERY WITH JOIN AND NOT FINAL
CriteriaBuilder builder = m_entityManager.getCriteriaBuilder();
CriteriaQuery<User> criteria = builder.createQuery(User.class);
Root<User> userRoot = criteria.from(User.class);
Join<User,Organization> organizationJoin = userRoot.join(User_.organizations,JoinType.INNER)

//DISTINCT BECAUSE JOIN WITH MULTIPLE ORGs RETURN REPEATED RESULTS
criteria.select(cb.distinct(userRoot));

criteria.where(organizationJoin.get(Organization_.id).in(orgsIds));
//获取ID列表
List ORGSID=new ArrayList();
for(组织机构:myOrgs){
添加(org.getId());
}
//使用联接而非最终值创建查询
CriteriaBuilder=m_entityManager.getCriteriaBuilder();
CriteriaQuery criteria=builder.createQuery(User.class);
Root userRoot=criteria.from(User.class);
Join organizationJoin=userRoot.Join(用户\组织,JoinType.INNER)
//不同,因为与多个组织的联接会返回重复的结果
选择(cb.distinct(userRoot));
其中(organizationJoin.get(Organization.id).in(orgsid));
另一个在JPA 2.1中新增且更有效的选项是在join中添加另一个条件,如下所示:

Join<User,Organization> organizationJoin = userRoot.join(User_.organizations,JoinType.INNER);
organizationJoin.on(cb.and(organizationJoin.get(Organization_.id).in(orgsIds)));
Join-organizationJoin=userRoot.Join(User.organizations,JoinType.INNER);
on(cb.and(organizationJoin.get(Organization.id).in(orgsIds));

删除where子句早上好,我想尝试以下方法:

//GET A LIST OF IDS
List<Long> orgsIds = new ArrayList<>();
for (Organization org : myOrgs){
    orgsIds.add(org.getId());
}

//CREATE QUERY WITH JOIN AND NOT FINAL
CriteriaBuilder builder = m_entityManager.getCriteriaBuilder();
CriteriaQuery<User> criteria = builder.createQuery(User.class);
Root<User> userRoot = criteria.from(User.class);
Join<User,Organization> organizationJoin = userRoot.join(User_.organizations,JoinType.INNER)

//DISTINCT BECAUSE JOIN WITH MULTIPLE ORGs RETURN REPEATED RESULTS
criteria.select(cb.distinct(userRoot));

criteria.where(organizationJoin.get(Organization_.id).in(orgsIds));
//获取ID列表
List ORGSID=new ArrayList();
for(组织机构:myOrgs){
添加(org.getId());
}
//使用联接而非最终值创建查询
CriteriaBuilder=m_entityManager.getCriteriaBuilder();
CriteriaQuery criteria=builder.createQuery(User.class);
Root userRoot=criteria.from(User.class);
Join organizationJoin=userRoot.Join(用户\组织,JoinType.INNER)
//不同,因为与多个组织的联接会返回重复的结果
选择(cb.distinct(userRoot));
其中(organizationJoin.get(Organization.id).in(orgsid));
另一个在JPA 2.1中新增且更有效的选项是在join中添加另一个条件,如下所示:

Join<User,Organization> organizationJoin = userRoot.join(User_.organizations,JoinType.INNER);
organizationJoin.on(cb.and(organizationJoin.get(Organization_.id).in(orgsIds)));
Join-organizationJoin=userRoot.Join(User.organizations,JoinType.INNER);
on(cb.and(organizationJoin.get(Organization.id).in(orgsIds));

删除where子句

有用的URL?您是否先尝试使用SQL/JPQL?转换为标准将更容易。有用的URL?您是否先尝试使用SQL/JPQL?转换为标准将更容易。