나는 타입 안전을 좋아한다. CriteriaQuery은 JPA 2.0을 가져온다. 그러나 보일러 플레이트 코드를 가져온다. 예를 들어 NamedEntity라는 엔티티가 있다고 가정 해 봅시다.이 엔티티에는 "name"이라는 id와 String 필드가 있습니다.이 엔트리에는 true로 설정된 고유 제한 조건이 있다고 가정합니다./복사를 피하기 각 쿼리 방법에 동일한 코드 라인을 붙여 넣기하기 위해 코드를 응축 할 수있는 방법이 있나요JPA 2.0에서 CriteriaQuery와 관련된 보일러 플레이트 코드의 양을 줄이는 방법이 있습니까?
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();
}
}
다음은 NamedEntityManager 같이 보일 수 있습니다 무엇입니까? 아마 어떻게 든 CriteriaQuery 객체를 재사용 할 수 있을까요?
이 상황은 전략을 사용하여 쉽게 해결할 수 있습니다. 메소드가 say, WhereClauseBuilder 타입의 하나의 매개 변수 (인터페이스)를 취해야하는 private 메서드를 하나만 만들면 private 메서드는이 매개 변수에서 다양한 부분 (where 절)을 criteriaBuilder와 쿼리를 전달하는 메서드 호출을 통해 가져옵니다. 모든 public 메소드는 필수 절 where 절을 리턴하는 특정 WhereClauseBuilder를 사용하여 개인 메소드를 호출합니다. –