2

我正在使用 ecliselink,并尝试将本机 SQL 转换为包含子查询的 Criteria API,但出现与子查询排序相关的异常。

使用子查询根据项目价格计算销售订单总额:

public class SalesOrder {
   BigDecimal totalPrice;
   public List<OrderItem> orderItems;

}

public class OrderItem {

   SalesOrder salesOrder;
   BigDecimal itemPrice;
}

update SalesOrder so set so.total=(select sum(itemPrice) from OrderItem oi where oi.salesOrderId=so.id);

使用 Criteria API 转换更新查询

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaUpdate<SalesOrder> criteriaUpdate = criteriaBuilder.createCriteriaUpdate(SalesOrder.class);

Root<SalesOrder> root = criteriaUpdate.from(SalesOrder.class);

Subquery<BigDecimal> subquery = criteriaUpdate.subquery(BigDecimal.class);
Root<InventoryForm> subqueryRoot = subquery.correlate(root);
Expression<BigDecimal> itemPricePath = subqueryRoot.join("orderItems", JoinType.LEFT).get("itemPrice");
subquery.select(criteriaBuilder.sum(itemPricePath));

Path<BigDecimal> totalPricePath = root.get("totalPrice");
criteriaUpdate.set(totalCostPath, subquery);

em.createQuery(criteriaUpdate).executeUpdate(); 

得到错误:

org.eclipse.persistence.exceptions.QueryException
Exception Description: Invalid query key [orderItems] in expression.
Query: UpdateAllQuery(referenceClass=SalesOrder )
    at org.eclipse.persistence.exceptions.QueryException.invalidQueryKeyInExpression(QueryException.java:696)
    at org.eclipse.persistence.internal.expressions.QueryKeyExpression.validateNode(QueryKeyExpression.java:1009)
    at org.eclipse.persistence.expressions.Expression.normalize(Expression.java:3275)
    at org.eclipse.persistence.internal.expressions.DataExpression.normalize(DataExpression.java:369)
    at org.eclipse.persistence.internal.expressions.QueryKeyExpression.normalize(QueryKeyExpression.java:756)
    at org.eclipse.persistence.internal.expressions.QueryKeyExpression.normalize(QueryKeyExpression.java:669)
    at org.eclipse.persistence.internal.expressions.SQLSelectStatement.normalize(SQLSelectStatement.java:1461)
    at org.eclipse.persistence.internal.expressions.SubSelectExpression.normalizeSubSelect(SubSelectExpression.java:205)
4

0 回答 0