2

I am using ecliselink, and try to convert a native SQL to Criteria API which contains subquery, but got exception that is related to collation of subquery.

Calculate sales order total from item prices using subquery:

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);

Convert the update query using 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(); 

Got the error:

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)
Dave
  • 759
  • 2
  • 9
  • 31

0 Answers0