|

Именованый запрос может послужить отличным примером использования специфического запроса, когда обычного объектно-реляционного маппинга недостаточно. Есть варианты использования hibernate query language прямиком из кода, а можно просто в конфигурационном файле hibernate указать именованый запрос с использованием параметров. Рассмотрим пример несложного именованого запроса, который будет селект из таблицы по определенным параметрам, которые будут передаваться из java кода.
| 1 | <sql-query name="getObjectsByType"> |
| 2 | <return-scalar column="ID" type="long"> |
| 5 | FROM test_objects objects |
| 6 | WHERE objects.user_id = :objId and objects.type in (:types) |
| 8 | </return-scalar></sql-query> |
Рассмотрим построчно: 1. Объявление именованого запроса:
| 1 | <sql-query name="getObjectsByType"> |
Теперь из java кода можно будет получать ссылку на именованый запрос по имени "getObjectsByType". 2. Возвращаемый тип данных:
| 1 | <return-scalar column="ID" type="long"> |
В данном случае возвращаются только id пользователей, то есть скалярный тип long. Возвращаемых типов может быть много, в зависимости от того, какие колонки выбираются в селекте. Также можно возвращать сущности, спроецированные на классы, об этом подробно расписано в туториалах по хибернейту. 3. Тело запроса удобно помещать в блок CDATA, если xml не проходит валидацию, либо будет использована сериализация xml и, чтобы данные не потерялись, они передаются в таком виде, в каком мы их объявили внутри блока.
4. Сам запрос не должен вызвать проблем с объяснениями, единственное на что стоит обратить внимание, так это на два параметра : :objId и :types Это параметры, которые будут подставляться при вызове именованого запроса. Теперь рассмотрим пример вызова этого запроса:
| 02 | Session session = HibernateUtils.getSessionFactory() |
| 04 | // Получаем наш именованый запрос по имени |
| 05 | Query named = session.getNamedQuery("getObjectsByType"); |
| 06 | // передаем параметр objId |
| 07 | named.setParameter("objId ", 123); |
| 08 | // Теперь нужно передать второй запрос. Поскольку там несколько значений, в которых будет использоваться поиск |
| 09 | // Надо передать коллекцию с параметрами |
| 10 | List<String> types = new ArrayList<String>(); |
| 13 | // Передаем коллекцию как второй параметр |
| 14 | named.setParameterList("types", types); |
| 15 | // Получаем результаты выполнения запроса |
| 16 | List<Object> result = named.list(); |
| 17 | </object></string></string> |
Для выполнения вышеуказанных действий, необходимо иметь необходимые библиотеки hibernate + отлавливать исключения ( если вы не используете IDE ). Именованые запросы могут выполнять всевозможные запросы. Все, что можно написать чистым sql, можно сделать и там. Могут служить альтернативой stored procedure - хранимым процедурам, hibernate query language и составлению запросов на лету через java код. Удобность использования лежит в использовании декларативного объявления в xml и разделении кода. В новых версиях hibernate, named queries могут быть объявлены через аннотации, без использования xml. |