Selección de datos en JPA I

A continuación se presenta un sencillo ejemplo de como implementar una selección en JPA usando la clase CriteriaBuilder. Esto tiene la ventaja de que podemos implementar una selección de datos en Java sin teclear ni una sola query, ni en SQL ni en ningún otro lenguaje de consulta, haciedola totalmente independiente de la capa de datos y omitiendo la necesidad de almacenar y mantener dichas queries.

1. Se crea el objeto ‘query’ y la representación de la clausula FROM sobre el elemento del modelo de datos principal de nuestra claúsula.

CriteriaBuilder cb = this.getEntityManager().getCriteriaBuilder();
CriteriaQuery<Long> countTransaction = cb.createQuery(Long.class);
Root<BosTransactionsPO> root = countTransaction.from(BosTransactionsPO.class);

2. Se establecen los predicados de la clausula WHERE.

/* Predicates */
List<Predicate> predicates = new ArrayList<Predicate>();
Long plazaId = itineraryArg.getTollPlazaId();
if (plazaId != null) {
Predicate p = cb.equal(root.get("tollPlazaPO").get("id"), plazaId);
predicates.add(p);
}
countTransaction.where(predicates.toArray(new Predicate[0]));

3. Se establecen lo que se retornará en la selección. En este caso, es un SELECT COUNT(*).

countTransaction.select(cb.count(root));

4. Se ejecuta la query.

/* Execute query */
Long count = getEntityManager().createQuery(countTransaction).getSingleResult();