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