是否可以使用相同的CriteriaBuilder(JPA 2)实例创建多个查询?

pka*_*nen 13 java jpa criteria-api jpa-2.0

这似乎是一个非常简单的问题,但我还没有找到一个确定的答案.我有一个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);
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这样做可以吗?

Pas*_*ent 12

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

/**
 * 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();
Run Code Online (Sandbox Code Playgroud)

以下评论:

Query,TypedQuery, CriteriaBuilder,Metamodel,和 EntityTransaction而实体管理器是开放的实体管理器获取的对象是有效的.

6.5构建标准查询

CriteriaBuilder接口用于构造CriteriaQuery 对象.的CriteriaBuilder 实现是通过访问 getCriteriaBuilder所述的方法 EntityManagerEntityManagerFactory接口.

我希望能够重用单个CriteriaBuilder来为实体管理器的生命周期创建许多查询.但这是我的解释.然而,我最初的测试似乎证实这没有任何问题(相反的确是可怕的).