Hibernate — Hibernate Query (HQL) примеры: SELECT, INSERT, UPDATE, DELETE
Hibernate Query Language (HQL) примеры запросов SELECT, INSERT, UPDATE, DELETE
Hibernate может использовать свой мощный язык запросов Hibernate Query Language (HQL), который очень похож на родной SQL. В сравнении с SQL, HQL полностью объектно-ориентирован и использует понятия наследования, полиформизма и связывания.
HQL использует имя класса взамен имени таблицы, а также имя свойства вместо имени колонки!
Используемые технологии:
Hibernate 5.0.1.Final
Maven 3.2.5
IntelliJ IDEA 14
MySQL 5.6.25
1. Описание задачи
Изучить примеры основных запросов: SELECT, INSERT, UPDATE, DELETE, которые выполняются с помощью HQL.
2. Структура проекта
Используется база данных и классы из Hibernate – быстрый старт. Пример приложения Hello World. Там же есть исходники. Рекомендую прочитать эту статью, чтобы было понятно что и откуда берется_вставляется.
3. Пример запроса HQL Select
1 2 3 |
Query query = session.createQuery("from ContactEntity where firstName = :paramName"); query.setParameter("paramName", "Nick"); List list = query.list(); |
Создаем запрос, который можно прочитать так: из сущности ContactEntity (маппинг на таблицу Contact) взять строки, в которых колонка firstName = имяПараметра. Дальше параметру присваивается имя и выполняется запрос. Для БД из прошлого примера получим:
1 |
ContactEntity{id=3, firstName='Nick', lastName='VN', birthDate=2015-09-05, version=0} |
Так же можно указать параметр сразу:
1 2 |
Query query = session.createQuery("from ContactEntity where firstName = 'Nick' "); List list = query.list(); |
Общее замечание
За исключением названий Java классов и свойств, запросы не чувствительны к регистру. Т.е. SeLect будет эквивалентен sELEct, но в то же время org.hibernate.eg.FOO не эквивалентен org.hibernate.eg.Foo, и foo.barSet не равен foo.BARSET.
Кстати многие заметят, что в SQL обычно используются команды в верхнем регистре. В случае работы с Java и Hibernate чаще встречается использование стиля Java (нижний регистр). Ребята из org.jboss акцентируют внимание, что они используют подход Java для работы с Hibernate.
4. Пример запроса HQL Update
1 2 3 4 5 6 7 8 9 10 |
Query query = session.createQuery("update ContactEntity set firstName = :nameParam, lastName = :lastNameParam" + ", birthDate = :birthDateParam"+ " where firstName = :nameCode"); query.setParameter("nameCode", "Nick"); query.setParameter("nameParam", "NickChangedName1"); query.setParameter("lastNameParam", "LastNameChanged1" ); query.setParameter("birthDateParam", new Date()); int result = query.executeUpdate(); |
Запрос читается как: обновить колонку Contact (замапина на сущность ContactEntity) установив имя, фамилию и дату рождения согласно параметрам в тех местах, где имя равно значению параметра nameCode (в нашем случае — Nick). Дальше устанавливаем параметры и выполняем запрос. Результат — кол-во обновленных строк.
Замечание
Если вы используете пример из прошлой статьи, то там открывается транзакция до выполнения запросов. Для того чтобы изменения после запросов вступили в силу, необходимо подтвердить транзакцию. Полный код выглядит так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Session session = HibernateSessionFactory.getSessionFactory().openSession(); Transaction tx = session.beginTransaction(); Query query = session.createQuery("update ContactEntity set firstName = :nameParam, lastName = :lastNameParam" + ", birthDate = :birthDateParam"+ " where firstName = :nameCode"); query.setParameter("nameCode", "Nick"); query.setParameter("nameParam", "NickChangedName1"); query.setParameter("lastNameParam", "LastNameChanged1" ); query.setParameter("birthDateParam", new Date()); int result = query.executeUpdate(); tx.commit(); session.close(); |
Так же как и в примере выше, параметры можно писать напрямую. Можно записывать и вот так:
1 2 3 4 5 6 7 8 9 10 |
String queryString = "update ContactEntity set firstName = :nameParam, lastName = :lastNameParam" + ", birthDate = :birthDateParam"+ " where firstName = :nameCode"; int result = session.createQuery(queryString) .setString("nameParam", "StringName") .setString("lastNameParam", "LastNameString") .setString("birthDateParam", "2012.08.03") .setString("nameCode", "Vasya") .executeUpdate(); |
Результат будет таким же — в строке с именем Vasya, имя станет StringName, фамилия LastNameString, а дата присвоится 2012-08-03.
5. Пример запроса HQL Insert
HQL поддерживает запросы в виде INSERT INTO .. SELECT ..
другими словами:
insert into Object (id, name) select oo.id, oo.name from OtherObject oo»;
Т.е. стандартный синтаксис для SQL вида INSERT INTO .. VALUES ..
НЕ поддерживается.
Т.к. в проекте нет одинаковых таблиц, то пример не рабочий, но показывает как бы могло отработать, в случае наличия второй таблицы ContactEntity2 и соответствующих свойств:
1 |
String queryInsert = "insert into ContactEntity(firstName, lastName, birthDate) select firstName2, lastName2, birthDate2 from ContactEntity2"; |
6. Пример запроса HQL Delete
1 2 3 |
Query query = session.createQuery("delete ContactEntity where firstName = :param"); query.setParameter("param", "Leonid"); int result = query.executeUpdate(); |
Удалится строка с именем Leonid. Результат — кол-во удаленных строк.
Как и для update можно использовать другие варианты записи:
1 2 3 4 |
String sqlDeleteString = "delete ContactEntity where firstName = :param"; int result = session.createQuery(sqlDeleteString) .setString("param", "Leonid") .executeUpdate(); |
Результатом будет количество вставленных записей.
Ссылки для скачивания
31