Uwielbiam bezpieczeństwo typu CriteriaQuery przynosząc JPA 2.0, ale przynosi również trochę kodu płyty kotła. Na przykład, powiedzmy, że mam encję o nazwie NamedEntity, która po prostu ma identyfikator i pole String o nazwie "name" (zakładam, że ma ono unikalne ograniczenie ustawione na true). Oto co NamedEntityManager może wyglądać następująco:Czy istnieje sposób na zmniejszenie ilości kodu płyty kotła powiązanego z CriteriaQuery (w 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();
}
}
Czy istnieje sposób, aby skondensować kodu w celu uniknięcia kopiowanie/wklejanie samych linijek kodu do każdej metody wyszukiwania? Być może jakoś ponownie użyć obiektu CriteriaQuery?
Ta sytuacja może być łatwo rozwiązana za pomocą strategii. Po prostu stwórz jedną prywatną metodę, która powinna przyjmować jeden parametr (interfejs) typu powiedz: WhereClauseBuilder, metoda prywatna otrzyma zmienną część (klauzula where) z tego parametru poprzez wywołanie metody, które przechodzi przez kryterium kryteria i zapytanie do niego. Wszystkie publiczne metody, po prostu wywołają prywatną metodę z konkretnym WhereClauseBuilder, który zwraca wymagany predykat gdzie klauzula. –