2014-10-30 1 views
-1

쿼리 메서드가있는 상황에서 가장 쉬운 솔루션을 찾고 싶습니다.이 메서드는 엔터티의 일부 특성을 사용하고 해당 특성을 기반으로 해당 엔터티를 반환하는 쿼리를 수행합니다.조건 쿼리에 매개 변수를 추가하는 가장 쉬운 방법

질문 : 엔터티를 검색 할 수있는 특성을 더 추가하려면 질문에 ja 기준을 사용할 때 가장 쉬운 솔루션은 무엇입니까? 여기서 한 가지 측면은 이식성이 있어야한다는 것입니다. 나중에 속성을 추가하면 모든 코드를 다시 작성하고 싶지 않습니다.

이 방법은 오버로드로 수행 할 수 있지만 쉬운 해결책을 찾고 있습니다.

예를 들어 내 메소드의 코드입니다 : 내가, 예를 들어, 내가 다른 속성에 의해 자동차 엔티티를 검색 할 수있는 방법으로 날짜를이 쿼리를 확장하려면 어떻게해야합니까

public List<Car> findCar(String name) { 
     CriteriaBuilder cb = em.getCriteriaBuilder(); 
     CriteriaQuery<Car> c = cb.createQuery(Car.class); 
     Root<Car> d = c.from(Car.class); 
     Predicate condition = cb.equal(d.get(Car_.name), name); 
     c.where(condition); 
     TypedQuery<Car> q = em.createQuery(c); 
     List<Car> results = q.getResultList(); 

     return results; 
    } 

. 나는이 방법이 하나 이상의 인수를 취하는 것을 원하지 않는다.

답변

0

나는이 질문이 전에 여기에서 논의되지 않았다는 것에 약간 놀랐다.

그래서 조사를하고 가능한 대답을 찾았습니다.

가장 쉬운 방법은 별도의 클래스 f.x를 만드는 것입니다. CarSearchFilter은 당신이 (당신이 쿼리를 수행 할 의해 즉, 매개 변수) 다양한 필터를 가질 수 있습니다

public class CarSearchFilter { 

    private String name; 
    private Date date; 
    private String color; 
    //etc 

//getters and setters 

} 

새로운 매개 변수를 그냥 CarSearhFilter에 새 필드를 추가하고 쿼리를 수정, 쿼리에 추가 할이 방법 방법. 쿼리 메서드를 수정하지 않으면 여전히 그대로 작동합니다. API는 이런 식으로 좋아 보인다. 따라서 findCar 메서드는 다음과 같이 수정해야합니다.

public List<Car> findCar(CarSearchFilter filter) { 
    CriteriaBuilder cb = em.getCriteriaBuilder(); 
    CriteriaQuery<Car> c = cb.createQuery(Car.class); 
    Root<Car> d = c.from(Car.class); 

    // you have to add more predicates when you want more parameters 
    List<Predicate> predicates = new ArrayList<Predicate>(); 
    if (filter.getName() != null) { 
     predicates.add(cb.like(d.get(Car_.name), filter.getName())); 
    } 
    if (filter.getDate() != null) { 
     predicates.add(cb.lessThanOrEqualTo(d.get(Car_.date), filter.getDate())); 
    } 

    c.select(d).where(predicates.toArray(new Predicate[] {})); 
    TypedQuery<Car> q = em.createQuery(c); 
    List<Car> results = q.getResultList(); 

    return results; 
} 

이 작업을 수행하는 다른 방법이 있습니다. Tiny 제안, 필드의 값과 재산/필드 이름과 값과 같은 키를 사용하여 검색 필터를 저장하는 키/값 쌍 메커니즘을 사용하는 것이 가능하지만이 방법은 몇 가지 단점이 있습니다

  • 지도 하드 -입니다
  • 코딩 당신은 어딘가에
  • 오타 수행 할 수 있습니다
을 키를 저장해야