代码之家  ›  专栏  ›  技术社区  ›  pkainulainen

同一个CriteriaBuilder(JPA2)实例能否用于创建多个查询?

  •  12
  • pkainulainen  · 技术社区  · 14 年前

    这似乎是一个很简单的问题,但我还没有找到一个明确的答案。我有一个DAO类,它自然使用条件查询来查询数据库。因此,我想知道在创建不同查询时使用相同的CriteriaBuilder实现是否安全,还是必须为每个查询创建新的CriteriaBuilder实例。下面的代码示例应该说明我想做什么:

    public class DAO() {  
        CriteriaBuilder cb = null;
    
        public DAO() {
            cb = getEntityManager().getCriteriaBuilder();
        }
    
        public List<String> getNames() {
            CriteriaQuery<String> nameSearch = cb.createQuery(String.class);
            ...
        }
    
        public List<Address> getAddresses(String name) {
            CriteriaQuery<Address> nameSearch = cb.createQuery(Address.class);
            ...
        }
    }
    

    这样可以吗?

    4 回复  |  直到 13 年前
        1
  •  10
  •   Pascal Thivent    14 年前

    阅读第节中的javadoc 3.1.1 EntityManager接口 JPA 2.0规范(JSR 317)中:

    /**
     * Return an instance of CriteriaBuilder for the creation of
     * CriteriaQuery objects.
     * @return CriteriaBuilder instance
     * @throws IllegalStateException if the entity manager has
     *         been closed
     */
    public CriteriaBuilder getCriteriaBuilder();
    

    这句话就在:

    这个 Query , TypedQuery , CriteriaBuilder , Metamodel EntityTransaction 获取的对象 来自实体管理器的有效期为 该实体管理器已打开。

    和部分 6.5构建标准查询

    这个 标准化器 接口是 用于构造 CriteriaQuery 物体。这个 标准化器 通过访问 getCriteriaBuilder 方法 EntityManager EntityManagerFactory 接口。

    我希望能够重用一个 标准化器 在实体管理器的生命周期内创建许多查询。但这是我的解释。然而,我的初步测试似乎证实了这一点没有任何错误(相反,这确实是可怕的)。

        2
  •  1
  •   Sean Patrick Floyd    14 年前

    有趣的问题。我会说“当然,这就是标准查询的全部要点”,但我在这里找不到一个词来支持这一点: http://java.sun.com/javaee/6/docs/tutorial/doc/gjivm.html

    但是:如果它们不可重用,那就意味着EntityManager实际上会修改它们,这将是糟糕的API设计。所以:我希望它们可以再用,但我不能保证

        3
  •  1
  •   Manuel    14 年前

    这是安全的。

    您可以从EntityManagerFactory获取CriteriaBuilder。 在Hibernate实现中,CriteriaBuilder是EntityManagerFactory的实例字段。所以在传统情况下,没有风险。

        4
  •  1
  •   Community datashaman    7 年前

    Eclipse链接在开始查询时以随机方式(有时工作,有时不工作)生成错误(eclipseLink-6089,org.eclipse.persistence.exceptions.queryexception),然后在执行第一个查询之前生成另一个错误。见 Stack Overflow JBoss issues 详情。

    如果您一个接一个地运行查询或者计划使用Hibernate,那么重用CriteriaBuilder没有问题。