Может тот же CriteriaBuilder (JPA 2) экземпляр использоваться для создания нескольких запросов?

Это походит на довольно простой вопрос, но мне не удалось найти категорический ответ все же. У меня есть класс ДАО, который естественно запрашивает базу данных при помощи запросов критериев. Таким образом, я хотел бы знать, безопасно ли использовать ту же реализацию 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);
        ...
    }
}

Это в порядке, чтобы сделать это?

13
задан Pascal Thivent 21 May 2010 в 23:56
поделиться

2 ответа

Чтение документации javadoc в разделе 3.1.1 EntityManager Interface спецификации JPA 2.0 (JSR 317):

 / **
 * Вернуть экземпляр CriteriaBuilder для создания
 * Объекты CriteriaQuery.* @return экземпляр CriteriaBuilder
 * @throws IllegalStateException, если у менеджера сущностей есть
 * был закрыт
 * /
общедоступный CriteriaBuilder getCriteriaBuilder ();

И этот комментарий сразу после:

Запрос , TypedQuery , CriteriaBuilder , Метамодель и Получены объекты EntityTransaction от менеджера сущностей действительны, пока этот менеджер сущностей открыт.

И раздел 6.5 Создание запросов критериев

Интерфейс CriteriaBuilder - используется для создания CriteriaQuery объекты. CriteriaBuilder доступ к реализации осуществляется через getCriteriaBuilder метод EntityManager или Интерфейс EntityManagerFactory .

Я ожидаю, что можно будет повторно использовать один CriteriaBuilder для создания множества запросов в течение всего времени существования диспетчера сущностей. Но это моя интерпретация. Однако мое первоначальное тестирование, похоже, подтверждает, что в этом нет ничего плохого (наоборот, было бы действительно ужасно).

12
ответ дан 2 December 2019 в 00:17
поделиться

Интересный вопрос. Я бы сказал «конечно, в этом весь смысл критериальных запросов», но я не нашел здесь ни единого слова, подтверждающего это: http://java.sun.com/javaee/6/docs/tutorial/ doc / gjivm.html

Однако: если бы они не использовались повторно, это означало бы, что entitymanager фактически изменяет их, что было бы ужасным дизайном API. Итак: я надеюсь, что их можно будет использовать повторно, но я не могу этого гарантировать

1
ответ дан 2 December 2019 в 00:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: