Язык Hibernate Query (HQL) является объектно-ориентированным языком запросов, похожий на SQL, но не операции на таблицах и столбцах. HQL подходит для постоянных объектов и их свойств. Запросы HQL преобразуются из Hibernate в традиционные запросы SQL, которые выполняют операции в базе данных на круге.
Хотя можно непосредственно использовать Native SQL с операторами SQL и Hibernate, рекомендуется использовать HQL, чтобы избежать хлопот переносимости базы данных, насколько это возможно, и принять преимущества стратегий и кэширования Hibernate.
Ключевые слова, такие как Select, от и где чувствительны к случаям, но такие свойства, как имена таблиц и имена столбцов, различаются в HQL чувствительном.
Из заявления
Используйте пункт From, если вы хотите загрузить полный постоянный объект в память. Вот простой синтаксис с использованием пункта от From:
String hql = "от сотрудника"; Query Query = session.createequery (hql); список результатов = Query.list ();Если вам нужно полностью квалифицировать имя класса в HQL, просто укажите следующий пакет и имя класса:
String hql = "from com.hibernatebook.criteria.employee"; Query Query = session.createquery (hql); списка результатов = Query.list ();
Как утверждение
Предложение AS может использоваться для выделения псевдонима на запросы HQL в классе, особенно когда есть очень длинные запросы. Например, наши краткие примеры выше: следующие:
String hql = "от сотрудника как e"; Query Query = session.createequery (hql); список результатов = Query.list ();
Ключевое слово AS является необязательным, и вы также можете указать псевдоним непосредственно в последующем имени класса, как показано ниже:
String hql = "от сотрудника e"; Query Query = session.createequery (hql); список результатов = Query.list ();
Выберите пункт
Пункт Select обеспечивает больше управления, чем набор результатов из пункта. Если вы хотите получить несколько свойств объекта вместо всего объекта, используйте предложение SELECT. Вот простой синтаксис для использования оператора SELECT для получения объекта сотрудника просто First_Name Field:
String hql = "Выберите e.firstName из сотрудника e"; Query Query = session.createequery (hql); списка результатов = Query.list ();
Стоит отметить, что здесь, сотрудник. Firstname является атрибутом объекта сотрудника, а не поле таблицы работников.
Где пункт
Если вы хотите сузить конкретный объект, возвращаемый из хранилища, вы можете использовать предложение «Где». Вот простой синтаксис, используя пункт «Где»:
String hql = "От сотрудника e, где e.id = 10"; Query Query = session.createequery (hql); список результатов = Query.list ();
Порядок по пункту
Чтобы сортировать результаты запроса HQL, вам нужно будет использовать пункт «Заказ по поводу. Вы можете сортировать результаты в восходящем (ASC) или нисходящем (DESC) в результате, установленном путем сортировки результатов в любом атрибуте объекта. Вот простой синтаксис, используя пункт «Орден на порядок:
String hql = "От сотрудника e, где e.id> 10 порядок от E.Salary Desc"; Query Query = session.createequery (hql); список результатов = Query.list ();
Если вы хотите сортировать более чем одно свойство, вы просто добавите дополнительные свойства в конце команды, разделенной пунктом с запятыми, как показано ниже:
String hql = "От сотрудника e, где e.id> 10" + "порядок от e.firstname desc, e.salary desc"; Query Query = session.createquery (hql); списка результатов = Query.list ();
Группа по пункту
Этот пункт позволяет извлекать информацию из базы данных и группы значений Hibernate на основе атрибутов и обычно использует результат, чтобы включить общее значение. Вот простой синтаксис, используя пункт группы по пункту:
String hql = "select sum (e.salary), e.firtname из сотрудника E" + "Group by e.firstname"; Query Query = session.createequery (hql); списка результатов = Query.list ();
Используйте названные параметры
Hibernate поддерживается в параметрах запроса HQL. Это позволяет легко писать и принимать ввод пользователей без необходимости защиты от запросов HQL на атаках SQL -инъекций. Вот простой синтаксис с использованием названных параметров:
String hql = "От сотрудника e, где e.id =: employee_id"; Query Query = session.createequery (hql); Query.setParameter ("employee_id", 10); списка результатов = Query.list (); Обновление пункта
Обновления пакетов являются новым HQL с Hibernate3 и различными работами по удалению, так же, как Hibernate 3 и Hibernate2. Интерфейс запроса теперь содержит метод с именем executeUpdate () для выполнения обновления HQL или оператора удаления.
Предложение об обновлении может использоваться для обновления одного или нескольких свойств в одном или нескольких объектах. Вот простой синтаксис с использованием пункта обновления:
String hql = "Обновить набор работников набор заработной платы =: зарплата" + "где id =: employee_id"; Query Query = session.createquery (hql); Query.setParameter («заработная плата», 1000); Query.SetParameter ("employeee_id", 10); int result = query.executeupdate (); Удалить пункт
Предложение удаления может использоваться для удаления одного или нескольких объектов. Вот простой синтаксис с использованием пункта Delete:
String hql = "Удалить из сотрудника" + "где id =: employee_id"; Query Query = session.createquery (hql); Query.setParameter ("employee_id", 10); int result = Query.executeUpdate (); System.out.println ("rows затронут:" + результат); Вставьте пункт
HQL поддерживает вставку в пункты, где только записи могут быть вставлены из одного объекта в другой. Вот простой синтаксис, используя вставку в пункт:
String hql = "Вставка в сотрудника (FirstName, Lastname, зарплата)" + "Select FirstName, Lastname, зарплата от Old_employee"; Query Query = session.createeceery (hql); int result = Query.executeUpdate (); System.out.println ("rows затронут:" + результат); Метод агрегации
HQL поддерживает множественные методы агрегации, аналогичные SQL. Они работают в HQL так же в SQL и в следующем списке доступных функций:
Отличное ключевое слово вычисляет только уникальные значения, установленные на этой строке. Следующий запрос вернет только уникальный счет:
String hql = "select count (различный e.firstname) из сотрудника e"; Query Query = session.createequery (hql); списка результатов = Query.list ();
Использование запроса страниц
Существует два метода для интерфейсов запроса на страницы.
Вместе вы можете построить компонент пейджинга на веб -сайте или приложение Swing. Вот пример, вы можете расширить его, чтобы получить 10 строк:
String hql = "от сотрудника"; Query Query = session.createequery (hql); Query.setFirStresult (1); Query.SetMaxResults (10); списка результатов = Query.list ();
Критерии запроса
Hibernate предоставляет альтернативный способ управления объектами и последовательно, доступными в таблице RDBMS. Одним из методов является стандартный API, который позволяет создавать стандартное программирование объекта запроса, которое может применять правила фильтрации и логические условия.
Интерфейс сеанса Hibernate предоставляет экземпляр класса, который можно использовать для создания возвращаемого постоянного объекта, и приложение выполняет условный запрос на метод CreateCriteria ().
Ниже приведен пример простейшего условного запроса, который просто вернет каждый объект, соответствующий классу сотрудника.
Критерии CR = Session.CreateCriteria (employee.class); список результатов = cr.list ();
Ограничения и стандарты:
Вы можете использовать метод add () для добавления запроса об ограничении, используя объект критериев. Вот пример добавления лимита с записью возврата зарплаты, равной 2000:
Критерии cr = session.createcriteria (сотрудник
Вот несколько примеров, охватывающих различные сценарии и могут использоваться по мере необходимости:
Критерии cr = session.createcriteria (emplcienteeme.class); // Чтобы получить записи, имеющие зарплату более 2000cr.add (Retrictions.gt («Зарплата», 2000)); // для получения записей, имеющих зарплату менее чем 2000cr.add (ограничения. Zaracr.Add (RESTIRCTIONS.Like («FirstName», «Zara%»)); // чувствительная форма приведенного выше ограничения. nullcr.add (Retrictions.isnull («зарплата»)); // Чтобы проверить, не является ли данное свойство nullcr.add (Retrictions.isnotnull («зарплата»)); // проверить, является ли данное свойство. emptycr.add (Retrictions.isnotempty («зарплата»)); Вы можете создавать или или или или использовать LogicalExpression, чтобы ограничить следующие условия: критерии CR = Session.CreateCritia (employtee.class); Критерий зарплата = ограничения. Criterion name = Restrictions.ilike("firstNname","zara%");// To get records matching with OR conditionionsLogicalExpression orExp = Restrictions.or(salary, name);cr.add( orExp );// To get records matching with AND conditionsLogicalExpression andExp = Restrictions.and(salary, name);cr.add( andExp );List results = cr.list ();Хотя все вышеперечисленные условия могут быть непосредственно введены с использованием HQL в предыдущем учебном пособии.
Стандарты использования под пейджингом:
Существуют также стандартные интерфейсы, два метода для страниц.
Вместе с двумя вышеупомянутыми методами мы можем построить компонент пейджинга на нашем веб -сайте или приложение Swing. Вот пример, который можно расширить, чтобы получить 10 строк за раз:
Критерии cr = session.createcriteria (сотрудник
Результаты сортировки:
Стандартный API предоставляет org.hibernate.criterion.order Class Class Sorting Your Result, установленное в восходящем или нисходящем порядке, в соответствии с свойствами объекта. Этот пример демонстрирует, как сортировать, используя набор результатов класса заказа:
Критерии cr = session.createcritia (emplcienteee.class); // Чтобы получить записи с продажами более 2000cr.add (Retrictions.gt («Зарплата», 2000)); // Сортировка записей в упущенном ordercrit.addorder (order.desc («зарплата»)); // для сортировки записей в ascendercrit.addorder (orders.
Прогноз и агрегация:
Критерии API предоставляют класс org.hibernate. Класс прогнозов аналогичен ограничению класса, поскольку он предоставляет несколько статических заводских методов для получения экземпляров проекции. Обеспечивает
Вот несколько примеров, включающих различные схемы, которые можно использовать в соответствии с предписанием:
Критерии cr = session.createcriteria (employee.class); // Чтобы получить общее количество строк. Property.cr.setProjection (projections.max («зарплата»)); // Чтобы получить минимум свойства.
Критерии запросов Пример:
Рассмотрим следующий класс pojo:
Сотрудник открытого класса {Private Int ID; частная строка FirstName; частная строка Lastname; частный int зарплата; public employee () {} public employee (string fname, string lname, int arary) {this.firstname = fname; this.lastName = lname; это .salary = зарплата; } public int getId () {return id; } public void setId (int id) {this.id = id; } public String getFirstName () {return FirstName; } public void setFirstName (string first_name) {this.firstName = first_name; } public String getLastName () {return LastName; } public void setlastName (String last_name) {this.lastName = last_name; } public int getSalary () {return Parlary; } public void setSalary (int Parlary) {this.Salary = зарплата; }}Давайте создадим следующую таблицу сотрудников для хранения объекта сотрудника:
Создание таблицы сотрудники (id int not null auto_increment, first_name varchar (20) по умолчанию NULL, last_name varchar (20) по умолчанию NULL, зарплата int по умолчанию NULL, первичный ключ (ID));
Следующие будут отображенные файлы.
<? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype Hibernate Mapping Public "-// Hibernate/Hibernate Mapping dtd // en" "http://www.hibernate.org/dtd/hibernate mapping-3.0.dtd"> <hibernate-mapping> hampaplion> "nameeeee nameee nameee nameee nameee nameeee nameeee nameeee nameeee 'nameeee nameeee nameeee' nameeee namele <Meta attruity = "class-description"> Этот класс содержит детали сотрудника. </meta> <id name = "id" type = "int" column = "id"> <generator/> </id> <name = "firstname" column = "first_name" type = "string"/> <name = "lastname" column = "last_name" type = "string"/> <propatore = "зарплата" column "type =" int "/> </> </> </> <Свойство =" зарплата "=" зарплата "=" int "/> </> </> </> </> </> </> </> </> </> <.
Наконец, мы создадим метод Main () класса приложения для запуска, и мы будем использовать запрос критериев для приложения:
импортировать java.util.list; импортировать java.util.date; импортировать java.util.iterator; Импорт org.hibernate.hibernateException; Импорт org.hibernate.session; Импорт org.hibhernate.transaction; импорт org.hibernate.sessionFactory; импорт org.hibernate.criteria; import org.hibernate.criterion.Restrictions; импорт org.hibernate.criterion.projections; импорт org.hibernate.cfg.configuration; открытый класс Managemployee (частное сессионное факторие; public static void main (string [] args) {try {factory = new configuration (). configure (). buildsessionFactory (); } catch (throwable ex) {System.err.println ("Не удалось создать объект SessionFactory." + ex); бросить новый ExceptionInitializerError (Ex); } ManageMployee me = new ManageMployee (); / * Добавить несколько записей сотрудников в базу данных */ integer empid1 = me.addemployee ("zara", "ali", 2000); Integer EmpiD2 = me.addemployee ("Daisy", "das", 5000); Integer EmpiD3 = me.Addemployee («Джон», «Пол», 5000); Integer EmpiD4 = me.Addemployee ("Mohd", "yasee", 3000); / * Перечислите всех сотрудников */ me.listemployee (); / * Печать общего количества сотрудников */ me.countemployee (); / * Печать зарплаты toatl */ me.totalsalary (); } / * Метод для создания сотрудника в базе данных * / public Integer AddeMployee (String fname, String lname, int Parlary) {session = factory.opensession (); Транзакция tx = null; Целое число сотрудников = null; try {tx = session.beginTransaction (); Сотрудник сотрудника = новый сотрудник (fname, lname, зарплата); employeeeid = (целое число) сессия. SSAVE (сотрудник); tx.commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } наконец {session.close (); } return employeeid; } / * Метод для чтения всех сотрудников, имеющих зарплату более 2000 * / public void lectomployees () {session session = factory.opensession (); Транзакция tx = null; try {tx = session.beginTransaction (); Критерии CR = Session.CreateCriteria (employtee.class); // Добавить ограничение. Cr.Add (RELICTIONS.GT («Зарплата», 2000)); Список сотрудников = cr.list (); for (iterator iterator = сотрудники.iterator (); iterator.hasnext ();) {employtee employee = (employtee) iterator.next (); System.out.print («Имя:» + employee.getFirstName ()); System.out.print («Фамилия:» + employee.getlastname ()); System.out.println ("Зарплата:" + employee.getsalary ()); } tx.commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } наконец {session.close (); }} / * Метод для печати общего количества записей * / public void countemployee () {session = factory.opensession (); Транзакция tx = null; try {tx = session.beginTransaction (); Критерии CR = Session.CreateCriteria (employtee.class); // получить полное количество рядов. Cr.SetProjection (projections.RowCount ()); Список rowCount = cr.list (); System.out.println ("Total Coint:" + rowcount.get (0)); tx.commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } наконец {session.close (); }} / * Метод для печати суммы заработной платы * / public void totalsalary () {session = factory.opensession (); Транзакция tx = null; try {tx = session.beginTransaction (); Критерии CR = Session.CreateCriteria (employtee.class); // получить полную зарплату. Cr.SetProction (Projections.Sum («Зарплата»)); Список totalsalary = cr.list (); System.out.println («Общая зарплата:» + totalsalary.get (0)); tx.commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } наконец {session.close (); }}} Скомпилируйте и выполните:
Вот шаги для компиляции и запуска вышеуказанного приложения. Пожалуйста, убедитесь, что вы установили путь и трассу в классе соответствующим образом перед компиляцией и выполнением.
Будут получены следующие результаты, и запись будет создана в таблице сотрудников.
$ java Managemployee
..... Различные сообщения журнала будут отображаться здесь ......... Имя: Дейзи Фамилия: DAS Зарплата: 5000 Название Имя: Джон Фамилия: Пол Заработная плата: 5000 Перво.
Если вы проверьте таблицу работников, она должна быть записана следующим образом:
mysql> выберите * от сотрудника;
+-------------------------------+| id | first_name | last_name | зарплата |+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------