当前位置: 首页 > 知识库问答 >
问题:

是否使用CriteriaBuilder在子查询中选择路径?

阙佐
2023-03-14
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 em = /* ... */;
TypedQuery<Entity> tq = em.createQuery(queryString, Entity.class);

在实际操作中,查询中存在多个查询,因此需要使用CriteriaBuilder构造查询。到目前为止,我得到的最接近的方法是使子查询从Attributes a WHERE...中选择a,但这不限于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()方法,我想知道是否需要将实体与其属性连接到外部查询中,然后以某种方式将correlate(),但我从EE7 javadocs中不确定correlate()到底做了什么(但correlate()返回一个from,这意味着我可以从中进行选择,这是很有希望的)。

共有1个答案

商茂勋
2023-03-14

我最终在JPA2.0规范中找到了这个问题的答案。第276页有一个相关查询的示例:

为了表示一些涉及单向关系的相关子查询,将子查询的域与包含查询的域相关起来可能是有用的。这是通过使用子查询接口的correlate方法执行的。

例如:

CriteriaQuery<Customer> q = cb.createQuery(Customer.class);
Root<Customer> customer = q.from(Customer.class);
Subquery<Long> sq = q.subquery(Long.class);
Root<Customer> customerSub = sq.correlate(customer);
Join<Customer,Order> order = customerSub.join(Customer_.orders);
q.where(cb.gt(sq.select(cb.count(order)), 10))
.select(customer);
SELECT c
FROM Customer c
WHERE (SELECT COUNT(o) FROM c.orders o) > 10
from_clause ::=  FROM  identification_variable_declaration  ...
identification_variable_declaration ::= range_variable_declaration ...
range_variable_declaration ::= entity_name [AS] identification_variable
subquery_from_clause ::= FROM subselect_identification_variable_declaration ...
subselect_identification_variable_declaration ::=
  identification_variable_declaration |
  derived_path_expression [AS] identification_variable {join}* |
  derived_collection_member_declaration
derived_path_expression ::=
  superquery_identification_variable.{single_valued_object_field.}*collection_valued_field |
  superquery_identification_variable.{single_valued_object_field.}*single_valued_object_field
 类似资料:
  • 我有一个关于jpa中的子查询类的问题。我需要创建两个自定义字段的子查询,但是子查询没有多选方法,选择方法有表达式输入参数(在查询中这是选择)和配置方法不合适。 此外,我对联接子查询结果有疑问,是否可能?怎么做呢? 我有: 链延伸度 消息实体 查询包装 我需要创建这个查询(这是查询的一部分,我从谓词中获得的另一部分。JPQL不合适) 在子查询中我做 但是,子查询在params中没有带有Compoun

  • 问题内容: 我有这两个表: 学生: 班级: 我想给这个名字显示最后一个注册每个classId的学生的名字。这意味着,我应该为classId 1获得一个名称,为classId 2获得一个名称,以此类推。首先获取邮件(之后才知道学生的名字)的解决方案是: 它会打印最大日期,这是可以的,但同时也会为每个日期打印错误的邮件: 这是完全错误的()。因此,当我尝试加入用于获取名称的值时,会得到不正确的值。 换

  • 我已尝试获取以下代码的结果: 在某些情况下,我需要在上面使用“In cause”。我尝试使用获得结果,但对于param:ref它不能在本机查询中工作,但在ejb ql中,我只是得到了以下错误消息: null 我累坏了,大家能给我一些建议吗?thx寻求帮助

  • 目前,我正在为客户列表开发一个“过滤器”功能。 我有以下子查询,我不确定是否有办法用CriteriaBuilder构建它。它也可以在没有multiselect但是我需要、和来选择最小值。结果应该是一个数字。 例如客户余额表 更新:这是我当前的代码,但是 如何为我的子查询添加排序依据 如何设置maxResult 谢谢!B

  • 问题内容: 我有这样的SQL语句: 因此,它为personID提供了“区别”行: 如果我有这样的表: 它会回来 现在,我尝试通过JPA CriteriaBuilder进行此操作。 我的第一个想法是子查询: 但这会产生错误 怎么对这个? 马可 问题答案: 我认为解决方案比看起来简单。您忘记了包含在CriteriaBuilder子查询中。以下代码执行您要查找的查询。 此代码将创建以下查询: 我认为您正