Cómo utilizar CriteriaQuery SUMA de operaciones personalizadas en algunas células?

Tener en cuenta que han de tabla de T, con los campos a y B.

Con regular SQL, yo podría hacer esto:

SELECT SUM(A * (100.0 - B) / 100.0) AS D FROM T;

Y me gustaría conseguir exactamente lo que yo esperaba.

Sin embargo, no estoy seguro de cómo hacerlo con CriteriaQuery.

Sé cómo hacer la suma de más de 1 campo, pero no se cómo hacer la suma de algunos de matemáticas de expresión a través de varios campos en una fila.

InformationsquelleAutor ioreskovic | 2014-02-07

1 Kommentar

  1. 16

    La CriteriaBuilder interfaz proporciona las siguientes funciones aritméticas:

    • además: sum(a, b)
    • sustracción: diff(a, b)
    • multiplicación: prod(a, b)
    • división: quot(a, b)

    donde a b parámetros puede ser una expresión y/o literal.

    Como para la consulta, aquí es un ejemplo escrito en una forma legible:

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Number> q = cb.createQuery(Number.class);
    Root<T> t = q.from(T.class);
    
    //build SUM(A * (100.0 - B) /100.0) expression
    Expression<Double> diff = cb.diff(100.0, t.<Double>get("B"));
    Expression<Double> prod = cb.prod(t.<Double>get("A"), diff);
    Expression<Number> quot = cb.quot(prod, 100.0);
    Expression<Number> sum = cb.sum(quot);
    q.select(sum.alias("D"));
    
    System.out.println(em.createQuery(q).getSingleResult());

    Usted también puede construir la consulta como un one-liner:

    q.select(cb.sum(cb.quot(cb.prod(t.<Double>get("A"), cb.diff(100.0, t.<Double>get("B"))), 100.0)).alias("D"));

    Espero que te aclare tus dudas.

    • Funciona como un encanto, thx mucho 🙂
    • me estoy poniendo de error como «ERROR: ERROR: la columna «cmshcpcsco8_.nonfacility_pe_rvu» debe aparecer en la cláusula GROUP BY o ser utilizado en una función de agregado». alguna idea ??
    • quot método devuelve el cociente. Cómo obtener la división de dos expresiones?

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea