CriteriaBuilder 如何用于构造表单的子查询,SELECT a FROM e.attributes a ....其中e外部查询中引用了某个实体?
我有一些涉及自由形式键值结构的实体类(这有其自身的问题,但这就是我所拥有的)。我需要找到存在某些键值对的实体。我可以将其编写为以下形式的 JPQL 查询:
SELECT e FROM Entity e
WHERE e.type = 'foo'
AND EXISTS (SELECT a FROM e.attributes a
WHERE a.key = 'bar'
AND a.value = 'baz')
对于固定查询字符串,我可以使用 EntityManager.createQuery() 创建查询:
EntityManager em = /* ... */;
TypedQuery<Entity> tq = em.createQuery(queryString, Entity.class);
实际上,查询中存在多个EXISTS,因此我需要使用 CriteriaBuilder 来构造查询。到目前为止,我最接近的是 subquery SELECT a from Attributes a WHERE ...,但这e.attributes当然不限于:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Entity> query = cb.createQuery(Entity.class);
Root<Entity> root = query.from(Entity.class);
Subquery<Attribute> subquery = query.subquery(Attribute.class);
Root<Attribute> subroot = subquery.from(Attribute.class); // too broad
subquery.select(subroot)
.where(cb.and(//
cb.equal(subroot.get("key"), cb.literal("bar")),
cb.equal(subroot.get("value"), cb.literal("baz"))));
query.select(root)
.where(cb.and(//
cb.equal(root.get("type"), cb.literal("foo")), //
cb.exists(subquery)));
Subquery 有很多correlate()方法,我想知道我是否需要在外部查询中将实体与其属性连接起来,然后以某种方式关联(),但是我不确定 EE7 javadocs 中的关联到底是什么(但关联() 确实返回一个 From,这意味着我可以从中 SELECT ,这是有希望的)。
相关分类