JPA 2.1 / Eclipselink:将条件查询重用为命名查询

时间:2016-08-17 06:51:42

标签: jpa eclipselink jpa-2.1

我正在尝试将动态查询重用为命名查询,如下所述:

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
  }
}

这导致nullpointer,因为namedQuery第一次不存在。

如何以相同的方法重用查询,换句话说,如果存在namedquery,我如何以干净的方式检查(不使用try-catch)?

1 个答案:

答案 0 :(得分:0)

我不确定我是否理解您要解决的问题。首次初始化或获取时,getUserByParameter方法应该在EntityManagerFactory上构建。如果您希望跟踪已添加的内容,请随意向工厂添加属性,但这些应在初始化期间预先执行一次。

令人困惑的是,您希望重用查询结果 - 命名查询旨在帮助降低解析和准备查询的成本。 EclipseLink有query cache feature,如果使用相同的参数,可以为您返回结果,而无需自己缓存查询,参数和结果。