Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查询集合交叉点_Java_Jpa - Fatal编程技术网

Java 查询集合交叉点

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中)中实

我有两个EclipseLink持久化实体:发布和样式。每个版本都有一套样式

如何获得NamedQuery所有版本,其中至少有一种样式与特定版本相同

大概是

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