使用 CriteriaBuilder 从子查询中的路径中选择?

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 ,这是有希望的)。


largeQ
浏览 191回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java