J'adore le type de sécurité CriteriaQuery qui apporte JPA 2.0 mais qui apporte aussi un peu de code de chaudière. Par exemple, disons que j'ai une entité appelée NamedEntity, qui a simplement un id et un champ String appelé "name" (supposons que la contrainte unique soit true). Voici ce que le NamedEntityManager pourrait ressembler à:Existe-t-il un moyen de réduire la quantité de code de plaque de chaudière associée à une requête CriteriaQuery (dans 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();
}
}
est-il un moyen de condenser le code afin d'éviter de copier/coller les mêmes lignes de code dans chaque méthode de requête? Peut-être en quelque sorte réutiliser l'objet CriteriaQuery?
Cette situation peut être facilement résolue en utilisant la stratégie. Il suffit de créer une méthode privée pour que cette méthode prenne un paramètre (une interface) de type dit, WhereClauseBuilder, la méthode privée obtiendra sa partie variable (where clause) de ce paramètre via un appel de méthode qui passe le criteriaBuilder et l'interroge. Toutes les méthodes publiques appellent simplement la méthode privée avec un WhereClauseBuilder spécifique qui renvoie la clause where de prédicat requise. –