在 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)];