如何使用条件 Api 创建子查询

Posted

技术标签:

【中文标题】如何使用条件 Api 创建子查询【英文标题】:How to create a subquery using criteria Api 【发布时间】:2021-07-29 02:06:25 【问题描述】:

我尝试对标准 Api 执行以下 JPQL 子句

 SELECT new ProductDTOOut(p.id,p.name, 
    (SELECT pr.price FROM Price pr WHERE pr.product.id = p.id and pr.company.id = :companyId) ) 
    FROM Product p 

没有成功, 我该怎么做?

tnx 高级

【问题讨论】:

【参考方案1】:

我知道按照答案解决我的问题:

CriteriaBuilder cb = manager.getCriteriaBuilder();
CriteriaQuery<ProductDTOOut> criteriaQuery = cb.createQuery(ProductDTOOut.class);

// create query 
Root<Product> rootFrom = criteriaQuery.from(Product.class);

// creating subquery   
Subquery<Double> subquery = criteriaQuery.subquery(Double.class);
Root<Price>  subqueryRoot  = subquery.from(Price.class);
subquery.select(subqueryRoot.get(Price_.PRICE));

subquery.where(
 cb.equal(rootFrom.get(Product_.ID), 
   subqueryRoot.get(Price_.PRODUCT).get(Product_.ID)),
 cb.equal(
   subqueryRoot.get(Price_.COMPANY).get(Company_.ID), companyId));      


criteriaQuery.select(cb.construct(ProductDTOOut.class, 
        rootFrom.get(Product_.ID),
        rootFrom.get(Product_.NAME),
        subquery // here put subquery 
        ));

TypedQuery<ProductDTOOut> query = manager.createQuery(criteriaQuery);

return query.getResultList();

我希望我能帮助有同样问题的人。

【讨论】:

以上是关于如何使用条件 Api 创建子查询的主要内容,如果未能解决你的问题,请参考以下文章

使用 web api 发布/创建子实体对象时如何设置父实体 ID

如何在couchbase服务器中正确创建子查询的索引?

如何使用 Plotly Express 创建子图

如何仅使用 css 为垂直导航栏创建子菜单

使用 peewee 创建子查询,在子查询结果上使用 `.select`

如何使用 matplotlib 创建子图的大图?