2016-08-17 130 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){ 
    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();  
} 

我想過這樣的:

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不存在的第一次。

如何在同一個方法中重用查詢或換句話說,如果存在一個namedquery,我該如何檢查乾淨的方式(不使用try-catch)?

+0

似乎不可能:**「參數值不被保留」。**這意味着爲每個用戶返回相同的結果(它曾被定義爲命名查詢),這在這裏沒有意義。 – Steve

回答

0

我不確定我是否理解您要解決的問題。 getUserByParameter方法是在EntityManagerFactory上首次初始化或獲取時構建的。如果您希望追蹤已添加的內容,請隨時向您的工廠添加屬性,但這些只能在初始化期間進行一次。

令人困惑的是,您期待查詢結果被重用 - 命名查詢旨在幫助降低解析和準備查詢的成本。 EclipseLink具有query cache feature,如果使用相同的參數,則可以爲您返回結果,而無需您自己緩存查詢,參數和結果。