Java 查询集合交叉点
我有两个EclipseLink持久化实体:发布和样式。每个版本都有一套样式 如何获得NamedQuery所有版本,其中至少有一种样式与特定版本相同 大概是Java 查询集合交叉点,java,jpa,Java,Jpa,我有两个EclipseLink持久化实体:发布和样式。每个版本都有一套样式 如何获得NamedQuery所有版本,其中至少有一种样式与特定版本相同 大概是 SELECT r1 FROM Release r1, Release r2 WHERE INTERSECT(r1.styles, r2.styles) NOT EMPTY AND r2.id = :release_id 但我不知道这是否可能,也不知道是否能找到好的语法 感谢经过更多的研究,我认为不可能在纯JQL(或者更一般地在SQL中)中实
SELECT r1 FROM Release r1, Release r2
WHERE INTERSECT(r1.styles, r2.styles) NOT EMPTY AND r2.id = :release_id
但我不知道这是否可能,也不知道是否能找到好的语法
感谢经过更多的研究,我认为不可能在纯JQL(或者更一般地在SQL中)中实现,它需要第一个循环来生成WHERE条件 因此,我最终使用了Criteria API(刚刚发现):
Set releaseStyles=em.find(Release.class,Release_id).getStyles();
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery=cb.createQuery(Release.class);
Root=query.from(Release.class);
列表谓词=新的ArrayList();
表达式key=root.get(“id”);
表达式字段=root.get(“样式”);
对于(样式:releaseStyles){
add(cb.isMember(cb.literal(style),field));
}
query.select(root).where(cb.and(
cb.or(谓词.toArray(新谓词[0]),
cb.notEqual(钥匙,释放标识)
));
query.distinct(true);
query.groupBy(key);
返回em.createQuery(query.getResultList();
我认为直接使用JPA
实现这一目标不是一个简单的方法。首先,您需要在本机sql中找到正确的查询,然后尝试将其转换为JQL
。这或多或少是一个类似的问题
Set<Style> releaseStyles = em.find(Release.class, release_id).getStyles();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Release> query = cb.createQuery(Release.class);
Root<Release> root = query.from(Release.class);
List<Predicate> predicates = new ArrayList<Predicate>();
Expression<Integer> key = root.get("id");
Expression<Set<Style>> field = root.get("styles");
for (Style style : releaseStyles) {
predicates.add(cb.isMember(cb.literal(style), field));
}
query.select(root).where(cb.and(
cb.or(predicates.toArray(new Predicate[0])),
cb.notEqual(key, release_id)
));
query.distinct(true);
query.groupBy(key);
return em.createQuery(query).getResultList();