【发布时间】:2016-08-17 06:51:41
【问题描述】:
我正在尝试重用动态查询作为命名查询,如下所述:
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 第一次不存在。
我如何以相同的方法重用查询,或者换句话说,如果存在命名查询,我如何以干净的方式检查(不使用 try-catch)?
【问题讨论】:
-
似乎不可能:“参数值不保留。” 这意味着返回相同的结果(曾经定义为命名查询)每个用户在这里没有意义。
标签: jpa eclipselink jpa-2.1