Глава 13. Нативные SQL запросы

Вы можете так же выражать запросы на родном для ващей базы данных диалекте SQL. Это полезно если вы хотите использовать специфичные возможности такие как ключевое слово CONNECT в Oracle. Это так же предусматривает простой путь переноса приложений написаных с использованием SQL/JDBC на Hibernate.

13.1. Создание SQL Запроса

SQL запросы преставляются через тот же Query интерфейс, который используется для HQL запросов. Единствоенное различие заключается в том, что для SQL используется метод Session.createSQLQuery().

Query sqlQuery = sess.createSQLQuery("select {cat.*} from cats {cat}", "cat", Cat.class);
sqlQuery.setMaxResults(50);
List cats = sqlQuery.list();

Три параметра используемые при вызове createSQLQuery():

  • строка SQL запроса

  • название алиаса таблицы

  • возвращаемый запросом персистентный класс

Название алиаса используется в строке SQL запроса для обращений к свойствам замапленного класса (в данном примере это Cat). Вы можете получить множество объектов в одной строке передавая масив строк (String) для наименований алиасов и массив объектов Class соотвествующих классов.

13.2. Связи свойств и алиасов

Нотация {cat.*} использованная в примере выше является сокращением для "все свойства". Вы можете так же указать список свойств явно, но вы должны доверить Hibernate выбор алиасов для свойств. Заменой для таких алиасов являются название свойств с указанием алиаса таблиц для каждого свойства. В следующем примере мы получаем котов (Cat) из таблицы (cat_log) отличной от декларированной в метаданных маппинга. Обратите внимание на то, как используются алиасы свойств в выражении where.

String sql = "select cat.originalId as {cat.id}, "
    + "  cat.mateid as {cat.mate}, cat.sex as {cat.sex}, "
    + "  cat.weight*10 as {cat.weight}, cat.name as {cat.name}"
    + "     from cat_log cat where {cat.mate} = :catId"
List loggedCats = sess.createSQLQuery(sql, "cat", Cat.class)
    .setLong("catId", catId)
    .list();

Замечание: если вы перечисляете свойства явно, вы должны указать все свойства класса и дочерних к нему классов!

13.3. Именованные SQL запросы

Именованные SQL запросы могут быть определены в документе маппинга и вызваны в точности так же, как это осуществляется для HQL запросов.

List people = sess.getNamedQuery("mySqlQuery")
    .setMaxResults(50)
    .list();
<sql-query name="mySqlQuery">
    <return alias="person" class="eg.Person"/>
    SELECT {person}.NAME AS {person.name},
           {person}.AGE AS {person.age},
           {person}.SEX AS {person.sex}
    FROM PERSON {person} WHERE {person}.NAME LIKE 'Hiber%'
</sql-query>