私はタイプセーフティCriteriaQueryがJPA2.0をもたらすのが大好きですが、ボイラープレートコードも少しもたらします。たとえば、NamedEntityというエンティティがあり、これには単にidと "name"という文字列フィールドがあります(一意の制約がtrueに設定されていると仮定します)。NamedEntityManagerは次のようになります。
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();
}
}
同じコード行を各クエリメソッドにコピー/貼り付けしないようにするために、コードを凝縮する方法はありますか?おそらくどういうわけかCriteriaQueryオブジェクトを再利用しますか?