在 JPA 中怎么说,给我 Collection 字段在另一个列表中至少有一个项目的所有对象?

Posted

技术标签:

【中文标题】在 JPA 中怎么说,给我 Collection 字段在另一个列表中至少有一个项目的所有对象?【英文标题】:How do I say in JPA, give me all objects whose Collection field has at least one item in another list? 【发布时间】:2015-11-17 15:48:40 【问题描述】:

我有具有以下字段的 JPA 实体:

@ManyToMany
@JoinTable(name = "user_organization", 
           joinColumns =  @JoinColumn(name = "USER_ID") ,  
           inverseJoinColumns =  @JoinColumn(name = "ORGANIZATION_ID") )
@LazyCollection(LazyCollectionOption.FALSE)
@SortNatural
private SortedSet<Organization> organizations = new TreeSet<Organization>();

给定Organization 对象列表 (myOrgs) 并使用 CriteriaBuilder,我该如何编写子句来表示:

给我所有User 对象中至少有一个Organization myOrgs 变量?

我尝试了以下但没有成功...

final CriteriaBuilder builder = m_entityManager.getCriteriaBuilder();
final CriteriaQuery<User> criteria = builder.createQuery(User.class);
final Root<User> userRoot = criteria.from(User.class);
criteria.where(builder.isMember(myOrgs, userRoot.get(User_.organizations)), ...

我正在使用 JPA 2.1 和 Hibernate 4.3.6.Final。

【问题讨论】:

有用的网址? ***.com/questions/6340554/… 您是否先尝试过使用 SQL / JPQL ?到那时翻译成标准会容易得多。 【参考方案1】:

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

//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));

另一个选项,JPA 2.1 中的新选项,更有效的是在连接中添加另一个条件,如下所示:

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

并删除 where 子句

【讨论】:

以上是关于在 JPA 中怎么说,给我 Collection 字段在另一个列表中至少有一个项目的所有对象?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data JPA:InvalidDataAccessApiUsageException:参数值 [web] 与预期类型不匹配 [java.util.Collection (n/a)];

为啥 mongodb 不给我超过 100 个文件?

JPA集合映射

枚举的 JPA 映射集合

我可以在 JPA 中查询一个对象吗

spring jpa dao是怎么自动实现的