Consider you have table T, with fields A and B.
With regular SQL, I could do this:
SELECT SUM(A * (100.0 - B) / 100.0) AS D FROM T;
The CriteriaBuilder
interface provides the following arithmetic functions:
sum(a, b)
diff(a, b)
prod(a, b)
quot(a, b)
where a
b
parameters can be an expression and/or literal.
As for the query, here is an exampe written in a human readable form:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery q = cb.createQuery(Number.class);
Root t = q.from(T.class);
// build SUM(A * (100.0 - B) / 100.0) expression
Expression diff = cb.diff(100.0, t.get("B"));
Expression prod = cb.prod(t.get("A"), diff);
Expression quot = cb.quot(prod, 100.0);
Expression sum = cb.sum(quot);
q.select(sum.alias("D"));
System.out.println(em.createQuery(q).getSingleResult());
You can also build the query as an one-liner:
q.select(cb.sum(cb.quot(cb.prod(t.get("A"), cb.diff(100.0, t.get("B"))), 100.0)).alias("D"));
I hope it clarifies your doubts.