我有两个使用EclipseLink的持久化实体:Release和Style。每个版本都有一套风格。
如何使用NamedQuery all Release,其中至少有一个Style与特定版本相同?
这就像是
SELECT r1 FROM Release r1, Release r2
WHERE INTERSECT(r1.styles, r2.styles) NOT EMPTY AND r2.id = :release_id
但我不知道是否有可能找到好的语法。
由于
答案 0 :(得分:0)
经过更多的研究后,我认为不可能在纯JQL(或更常见的SQL)中实现它,它需要第一个循环来生成WHERE条件。
所以我最终使用了Criteria API(刚刚发现):
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();