Me encanta el tipo de seguridad CriteriaQuery que trae JPA 2.0 pero también trae un poco de código de placa de caldera. Por ejemplo, supongamos que tengo una entidad llamada NamedEntity, que simplemente tiene un id y un campo de cadena llamado "nombre" (suponiendo que tiene la restricción única establecida en verdadero). Esto es lo que la NamedEntityManager podría ser:¿Hay alguna forma de reducir la cantidad de código de placa de caldera asociada a un CriteriaQuery (en JPA 2.0)?
public class NamedEntityManager
{
//inject using your framework
EntityManager entityManager;
//retrieve all existing entities of type NamedEntity from DB
public Iterable<NamedEntity> queryAll()
{
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<NamedEntity> query = builder.createQuery(NamedEntity.class);
return entityManager.createQuery(query).getResultList();
}
//retrieve a single entity of type NamedEntity from DB using specified name
public NamedEntity queryByName(String name)
{
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<NamedEntity> query = builder.createQuery(NamedEntity.class);
Root<NamedEntity> root = query.from(NamedEntity.class);
query = query.where(root.<NamedEntity>get("name").in(name));
//skipped the try/catch block for the sake of brevity
return entityManager.createQuery(query).getSingleResult();
}
}
¿Hay una manera de condensar el código con el fin de evitar copiar/pegar las mismas líneas de código en cada método de consulta? ¿Quizás reutilice de algún modo el objeto CriteriaQuery?
Esta situación se puede abordar fácilmente mediante la estrategia. Simplemente cree un método privado que el método debe tomar un parámetro (una interfaz) de tipo say, WhereClauseBuilder, el método privado obtendrá su parte variable (cláusula where) de este parámetro a través de una llamada a método que pasa el criteriaBuilder y la consulta. Todos los métodos públicos, simplemente llamarán al método privado con un WhereClauseBuilder específico que devuelva la cláusula predicate where requerida. –