2016-08-17 3 views
0

여기에 설명 된대로 내가 명명 된 쿼리와 동적 쿼리를 다시 사용하려고 :JPA 2.1 /은 EclipseLink : 재사용 기준 쿼리로 명명 된 쿼리

https://wiki.eclipse.org/EclipseLink/Release/2.5/JPA21#Add_Named_Query 목표는 한 번만 기준 쿼리를 구축하는 것입니다

매개 변수가 변경되지 않으면 이름이 지정된 쿼리로 다시 사용하십시오.

public static List<User>getUserByParameter(ParameterMap parameter){ 

    Query userByParameter = em.createNamedQuery("userByParameter"); 
    if (null != userByParameter){ 
    return userByParameter.getResultList(); 
    }else { 
     //build the dynamic query as above 
    } 
} 

namedQuery이 처음이 존재하지 않기 때문에 이것은 nullpointer 결과 :

public static List<User>getUserByParameter(ParameterMap parameter){ 
    EntityManager em = getEntityManager(); 
    CriteriaBuilder builder = em.getCriteriaBuilder(); 
    CriteriaQuery<User> criteriaQuery = builder.createQuery(User.class); 

    Root<User> user = criteriaQuery.from(User.class);  

    List<Predicate> predicates = new ArrayList<Predicate>(); 

    //...build up the query depending on parameter 
    if (null != parameter.getStatus()){ 
    predicates.add(builder.equal(user.<Integer>get("status"), parameter.getStatus())); 
    } 
    //etc. 

criteriaQuery.select(user).where(predicates.toArray(new Predicate[]{})); 

Query query = em.createQuery(criteriaQuery); 

//now register this query as a namedQuery 
em.getEntityManagerFactory().addNamedQuery("userByParameter", query); 

return query.getResultList();  
} 

내가 좋아하는 뭔가에 대해 생각했다.

어떻게 내가 namedquery가 존재하는 경우 (시도 - 캐치를 사용하지 않고) 깨끗한 방법으로 방법을 확인할 수 있습니다, 같은 방법으로 또는 다른 단어에서 쿼리를 다시 사용할 수 있습니다?

+0

는 가능하지 않는 것 : ** "매개 변수 값이 유지되지 않습니다."** 그 (한 번 명명 된 쿼리로 정의된다) 같은 결과가 여기에 이해가되지 않습니다 각 사용자에 대해 반환되는 것을 의미 . – Steve

답변

0

나는 당신이 해결하기 위해 찾고있는 문제를 이해 모르겠어요. getUserByParameter 메소드는 EntityManagerFactory가 처음 초기화되거나 획득 될 때 EntityManagerFactory에 빌드되어야하는 무언가입니다. 당신은 당신이 이미 추가 한 내용을 추적하고자하는 경우 공장에 속성을 추가 부담하지만, 이러한 초기화하는 동안 한 번만, 선행 수행해야합니다. 이름 쿼리 구문 분석 및 준비 쿼리의 비용을 절감 할 수 있도록 설계 - 혼란 무엇

조회 결과를 재사용 할 것으로 예상된다는 것이다. 은 EclipseLink는 동일한 매개 변수를 사용하는 경우, 쿼리, 매개 변수 및 결과 자신을 캐시하지 않고, 당신을 위해 결과를 반환 할 수있는 query cache feature 있습니다.