Это походит на довольно простой вопрос, но мне не удалось найти категорический ответ все же. У меня есть класс ДАО, который естественно запрашивает базу данных при помощи запросов критериев. Таким образом, я хотел бы знать, безопасно ли использовать ту же реализацию 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);
...
}
}
Это в порядке, чтобы сделать это?
Чтение документации 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
для создания множества запросов в течение всего времени существования диспетчера сущностей. Но это моя интерпретация. Однако мое первоначальное тестирование, похоже, подтверждает, что в этом нет ничего плохого (наоборот, было бы действительно ужасно).
Интересный вопрос. Я бы сказал «конечно, в этом весь смысл критериальных запросов», но я не нашел здесь ни единого слова, подтверждающего это: http://java.sun.com/javaee/6/docs/tutorial/ doc / gjivm.html
Однако: если бы они не использовались повторно, это означало бы, что entitymanager фактически изменяет их, что было бы ужасным дизайном API. Итак: я надеюсь, что их можно будет использовать повторно, но я не могу этого гарантировать