为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

largeQ 2021-06-10 14:11:04
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 ,这是有希望的)。
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 190 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信