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 broadsubquery.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 ,这是有希望的)。
添加回答
举报
0/150
提交
取消