Я люблю безопасность типов, которую CriteriaQuery приносит лугу JPA 2.0, но он также приносит немного шаблонного кода. Например, позвольте, говорят, что у меня есть объект под названием NamedEntity, который просто имеет идентификатор, и поле String, названное "именем" (предположите, что этому установили ограничение на уникальность данных на истинный). Вот то, на что мог бы быть похожим NamedEntityManager:
public class NamedEntityManager
{
//inject using your framework
EntityManager entityManager;
//retrieve all existing entities of type NamedEntity from DB
public Iterable queryAll()
{
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery 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 query = builder.createQuery(NamedEntity.class);
Root root = query.from(NamedEntity.class);
query = query.where(root.get("name").in(name));
//skipped the try/catch block for the sake of brevity
return entityManager.createQuery(query).getSingleResult();
}
}
Существует ли способ уплотнить код, чтобы не копировать/вставлять те же строки кода в каждый метод запроса? Возможно, так или иначе снова используйте объект CriteriaQuery?