【问题标题】:JPA 2.1 / Eclipselink: Reuse Criteria Queries as Named QueriesJPA 2.1 / Eclipselink:重用标准查询作为命名查询
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-11-12
    • 2018-02-01
    • 2015-07-11
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    相关资源
    最近更新 更多