Изучаем Java EE 7 - [95]

Шрифт
Интервал

StoredProcedureQuery createNamedStoredProcedureQuery(String name)Генерирует запрос к именованной хранимой процедуре

При получении реализации интерфейса Query, TypedQuery или StoredProcedureQuery с помощью одного из фабричных методов в интерфейсе менеджера сущностей она будет контролироваться богатым API. API Query, показанный в листинге 6.21, задействуется для выполнения статических (то есть именованных) и динамических запросов с применением JPQL, а также «родных» запросов с использованием SQL. Кроме того, API Query поддерживает привязку параметров и управление разбиением на страницы.


Листинг 6.21. Query API

>public interface Query {

>··// Выполняет запрос и возвращает результат

>··List getResultList();

>··Object getSingleResult();

>··int executeUpdate();


>··// Задает параметры для запроса

>··Query setParameter(String name, Object value);

>··Query setParameter(String name, Date value, TemporalType temporalType);

>··Query setParameter(String name, Calendar value, TemporalType temporalType);

>··Query setParameter(int position, Object value);

>··Query setParameter(int position, Date value, TemporalType temporalType);

>··Query setParameter(int position, Calendar value, TemporalType temporalType);

>·· Query setParameter(Parameter param, T value);

>··Query setParameter(Parameter param, Date value, TemporalType temporalType);

>··Query setParameter(Parameter param, Calendar value, TemporalType temporalType);


>··// Извлекает параметры посредством запроса

>··Set> getParameters();

>··Parameter getParameter(String name);

>··Parameter getParameter(int position);

>·· Parameter getParameter(String name, Class type);

>·· Parameter getParameter(int position, Class type);

>··boolean isBound(Parameter param);

>·· T getParameterValue(Parameter param);

>··Object getParameterValue(String name);

>··Object getParameterValue(int position);


>··// Ограничивает количество результатов, возвращаемых запросом

>··Query setMaxResults(int maxResult);

>··int getMaxResults();

>··Query setFirstResult(int startPosition);

>··int getFirstResult();


>··// Задает и извлекает подсказки в запросах

>··Query setHint(String hintName, Object value);

>··Map getHints();


>··// Задает тип режима сброса для использования при выполнении запроса

>··Query setFlushMode(FlushModeType flushMode);

>··FlushModeType getFlushMode();


>··// Задает тип режима блокировки для использования при выполнении запроса

>··Query setLockMode(LockModeType lockMode);

>··LockModeType getLockMode();


>··// Разрешает доступ к API, специфичному для поставщика

>·· T unwrap(Class cls);

>}

Методы, которые главным образом используются в этом API, обеспечивают выполнение запроса как такового. Чтобы выполнить запрос SELECT, вам придется сделать выбор между двумя методами в зависимости от требуемого результата.

• Метод getResultList() выполняет запрос и возвращает список результатов (сущностей, атрибутов, выражений и т. д.).

• Метод getSingleResult() выполняет запрос и возвращает одиночный результат (генерирует исключение NonUniqueResultException при обнаружении нескольких результатов).

Для осуществления операции обновления или удаления метод executeUpdate() выполняет массовый запрос и возвращает несколько сущностей, затронутых при выполнении запроса.

Как вы уже видели в разделе «JPQL» ранее, при запросе могут использоваться параметры, которые являются либо именованными (например, myParam), либо позиционными (например,?1). API Query определяет несколько методов setParameter для задания параметров перед выполнением запроса.

Когда вы выполняете запрос, он может возвратить большое количество результатов. В зависимости от приложения они могут быть обработаны все вместе либо порциями (например, веб-приложение выводит только десять строк за один раз). Для управления разбиением на страницы интерфейс Query определяет методы setFirstResult() и setMaxResults(), позволяющие указывать соответственно первый получаемый результат (с нумерацией, начинающейся с нуля) и максимальное количество результатов для возврата относительно этой точки.

Режим сброса является для поставщика постоянства индикатором того, как следует поступать с ожидаемыми изменениями и запросами. Есть две возможные настройки режима сброса: AUTO и COMMIT. AUTO (используемая по умолчанию) означает, что поставщик постоянства обеспечивает, что ожидаемые изменения будут видимыми при обработке запроса. COMMIT используется, когда эффект от обновления сущностей не перекрывается измененными данными в контексте постоянства.

Запросы можно блокировать с помощью метода setLockMode(LockModeType).

В последующих разделах демонстрируется пять разных типов запросов с использованием описанных здесь методов.

Динамические запросы

Динамические запросы генерируются на лету по мере того, как это требуется приложению. Для создания динамического запроса используйте метод EntityManager.createQuery(), принимающий в качестве параметра строку, которая представляет JPQL-запрос.

В приведенном далее коде JPQL-запрос обеспечивает выборку всех клиентов из базы данных. Результатом этого запроса является список, так что, когда вы вызываете метод getResultList(), он возвращает список экземпляров сущности Customer (List). Однако если вы знаете, что ваш запрос возвращает только одну сущность, используйте метод getSingleResult(). Он возвращает одну сущность и избегает работы по извлечению данных в виде списка.


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.