Основным исследованием в этой статье является соответствующее содержание запроса HQL Hibernate HQL, следующим образом.
Язык Hibernate Query (HQL) является полностью объектно-ориентированным оператором запроса с очень мощными функциями запроса; Он имеет полиморфизм, ассоциацию и другие характеристики. Запрос HQL также является методом запроса, официально рекомендованным Hibernate.
Далее мы анализируем соответствующие методы запроса с помощью тематического исследования
Classes.java:
Общедоступные классы классов {/*идентификатор класса*/private int id;/*Имя класса*/private String name;/*Отношения между классом и студентами*/private <tlpated> Студенты; // Опумивание методами и методами Getter}}Студент. Ява:
студент открытого класса {/*идентификатор студента*/private int id;/*Имя студента*/private String name;/*Отношения между учениками и классом*/Занятые классы классов; // Опустить сеттер и методы Getter}Classes.hbm.xml:
<? xml version = "1.0"?> <! Doctype Hibernate Mapping Public "-// Hibernate/Hibernate Mapping Dtd 3.0 // en" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package = "com.lixue.bean"-ravecue. name="Classes" table="t_classes" lazy="false"> <id name="id"> <generator/generator/> </id> <property name="name"/> <!-- One-to-many mapping, inverse="true" means to hand over the relationship to the peer--> <set name="students" inverse="true"> <key column="classesid"/> <one-to-many/> </set> </class> </hibernate-mapping>
Студент.hbm.xml:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.lixue.bean"> <class name="Student" TABLE = "T_STUDENT"> <ID NAME = "ID"> <Generator // ID> <!-MAP нормальные свойства-> <name = "name"/> <!-сопоставление много-одно-одному, добавьте внешний ключ в многократный конец-> <много-одно имя = "classest =" classid "/> </class> </hibernate-mapping>
/*Вернуть список атрибутов набора результатов, тип элемента и типы атрибутов в классе объектов одинаковы*/ list <string> studies = session.createquery («Выберите имя от студента»). List (); /*Travel*/ for (iterator <string> iter = studies.iterator (); iter.hasnext ();) {string name = (string) iter.next (); System.out.println (имя); }Примечание. При запросе одного атрибута возвращаемый набор является коллекцией, а тип элемента сбора - тип атрибута.
/*Запросить несколько свойств, возвращение массива объектов*/ list <object []> study = session.createquery («Выбрать идентификатор, имя от студента»). List (); /*Transip*/ for (iterator <object []> iter = studies.iterator (); iter.hasnext ();) {object [] obj = (object []) iter.next (); System.out.println (obj [0] + "," + obj [1]); }Примечание. Запрос нескольких атрибутов возвращает коллекцию массивов объектов типа. Это легко понять. При запросе одного атрибута является возвращаемый тип элемента коллекции, это тип атрибута, но как насчет нескольких типов? Это должно быть массивом объектов для обработки, то есть объект [].
/*Мы устанавливаем соответствующий конструктор для объекта Entity, а затем мы можем вернуть коллекцию типов объектов объекта, запрашивая объект*/ list Students = session.createquery («Выберите« Новый студент (идентификатор, имя) от студента »). List (); /*Travel*/ for (iterator iter = Student.iterator (); iter.hasnext ();) {студент студента = (студент) iter.next (); System.out.println (Student.getId () + "," + study.getName ()); }Примечание. В дополнение ко второму методу мы возвращаем массив объектов, мы также можем установить соответствующий конструктор для объекта объекта, а затем запросить объект, запрашивая объект, а затем вернуть коллекцию типов объектов.
/*Можно использовать псевдонимы*/ list <object []> study = session.createequery («select s.id, s.name из студента s»). List (); /*Transip*/ for (iterator <object []> iter = studies.iterator (); iter.hasnext ();) {object [] obj = (object []) iter.next (); System.out.println (obj [0] + "," + obj [1]); } /*Возврат - это коллекция типов объектов объекта*/ list <tootdent> студенты = session.createquery ("from Student"). List (); /*Transip*/ for (iterator <toodt iter = Student.iterator (); iter.hasnext ();) {Студент студент = (студент) iter.next (); System.out.println (Student.getName ()); }ПРИМЕЧАНИЕ. Запросные объекты могут напрямую использовать форму имени от класса.
/*Использовать SELECT для использования псевдоним*/ list <toolding> студента = session.createquery ("select s из студента s"). List (); /*Transip*/ for (iterator <toodt iter = Student.iterator (); iter.hasnext ();) {Студент студент = (студент) iter.next (); System.out.println (Student.getName ()); }Примечание. Если вы хотите использовать ключевое слово SELECT, вы должны использовать псевдоним. Следует отметить другой момент: HQL не поддерживает форму SELECT *.
/ ** * Если вы используете список для запроса объекта объекта, будет выпущено оператор запроса для получения данных объекта объекта * * * Hibernate: Select Student0_.id как id0_, student0_.name as name0_, * student0_.createtime as createtime0_, student0_.classesid as classeid0_ * from t_student student0_ */ student <clite -exation.craite.craste. Студент "). List (); /*Travel*/ for (iterator <toold> iter = Student.iterator (); iter.hasnext ();) {Студент студент = (студент) iter.next (); System.out.println (Student.getName ()); }ПРИМЕЧАНИЕ. При использовании метода .list () для запроса объектов будет выпущен только один оператор, то есть оператор, который получает данные физического объекта.
/*** Проблема n+1 произойдет. Так называемый n+1 относится к выдаче операторов N+1 SQL * * 1: Выдача заявления, который запрашивает список идентификации * hibernate: select student0_.id как col_0_0_ из T_STUDENT Student0_ * N: выдача n SQL Заявления, основанные на идентификаторе, чтобы загрузить соответствующий объект * hibernate: select student0_id as ed0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0. * student0_.createtime as createtime0_0_, Student0_.classesid as classisid0_0_ * от t_student student0_ где student0_.id =? * */ Iterator <toold> iter = session.createquery ("от студента"). Iterate (); /*Путешествие*/ while (iter.hasnext ()) {Студент Студент = (Студент) iter.next (); System.out.println (Student.getName ()); }ПРИМЕЧАНИЕ. При выполнении запроса объекта через итератор () будут выпущены операторы n+1. Во -первых, будет выпущено заявление для запроса идентификатора объекта объекта, а затем N -операторы будут выпущены на основе их соответствующих идентификаторов для запроса n объектов. Формальная производительность относительно плохая.
/*Хранение запросной коллекции в кэше первого уровня, то есть кэш на уровне сеанса*/ list <toodtecults = session.createquery («от студента»). List (); /*Transip*/ for (iterator <toodt iter = Student.iterator (); iter.hasnext ();) {Студент студент = (студент) iter.next (); System.out.println (Student.getName ()); } System.out.println("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Avoid N+1 problem* * Because after performing Операция списка, данные будут размещены в кэше сеанса (кэш первого уровня), при использовании ITEATE * сначала будет выпущено заявление, которое будет выпущено в списке идентификаторов, а затем соответствующие данные будут загружены в кэше в соответствии с идентификатором. Кэш, это может улучшить производительность, в противном случае возникает проблема n+1**/ ИтераторПримечание. Фактически, Hibernate предоставляет запрос итератора () для повышения производительности, так почему это слишком много помогает? Причина в том, что итератор () получает данные из кэша первого уровня. Если в кэше есть данные, его эффективность, несомненно, будет довольно мощной. Однако, когда я запрошу в первый раз, как могут быть данные в кэше? Это приводит к так называемой проблеме N+1. Приведенный выше код может избежать проблемы N+1. Его идея состоит в том, чтобы использовать список () сначала для запроса, потому что после запроса списка () данные существуют в резюме кэша первого уровня, а при использовании итератора () эффективность будет очень высокой.
/*Запрос в соответствии с условиями (псевдоним обычно используются здесь, что является более удобным)*/ list <object []> studies = session.createequery («select s.id, s.name от студента s, где s.name like '%0%'»). List (); /*Travel*/ for (iterator <object []> iter = studies.iterator (); iter.hasnext ();) {object [] obj = (Object []) iter.next (); System.out.println (obj [0] + "," + obj [1]); }Примечание. Условный запрос такой же, как и нативный SQL, оба из которых являются ключевыми словами. Кроме того, обычно удобнее использовать псевдоним. Приведенная выше программа предназначена для запроса нескольких атрибутов, поэтому она возвращает коллекцию типов массива объектов, а элементы в массиве объектов являются соответствующими атрибутами.
/*Chenged Programming*/ list <Object []> Student = Session.CreateQuery («SELECT S.ID, S.Name из студента S, где нравится S.Name?») .SetParameter (0, «%0%») .List (); /*Travel*/ for (iterator <object []> iter = studies.iterator (); iter.hasnext ();) {object [] obj = (Object []) iter.next (); System.out.println (obj [0] + "," + obj [1]); }Примечание. Параметры могут передаваться через заполнители, которые могут предотвратить инъекцию SQL.
/*Программирование чипов*/ list <object []> study = session.createquery («select s.id, s.name из студента s, где s.name like: myname») .setparameter ("myname", "%0%") .list (); /*Массив объектов*/ for (iterator <object []> iter = studies.iterator (); iter.hasnext ();) {object [] obj = (object []) iter.next (); System.out.println (obj [0] + "," + obj [1]); }ПРИМЕЧАНИЕ: например: нет места после MyName Colon, в противном случае возникнет ошибка.
[java] Просмотр простой копии/ * Принят метод в IN, можно использовать только один формальный параметр */ list <object []> studies = session.createquery ("select s.id, s.name from sceed s.id in (: ids)") .setparameterlist ("ids", новый объект [] {1, 2, 3, 4, 5, 5) .list ("); /*Transip*/ for (iterator <object []> iter = studies.iterator (); iter.hasnext ();) {object [] obj = (object []) iter.next (); System.out.println (obj [0] + "," + obj [1]); }ПРИМЕЧАНИЕ. В скобках есть только один формальный параметр после внедрения. Когда мы устанавливаем значение параметра, мы можем передать значение через массив объектов.
/* Запрос студентов В 2009-08 годах вы можете позвонить в функцию форматирования даты MySQL*/ list <Object []> Student = Session.Createquery («SELECT S.Id, S.Name от студента Share_format (S.Createtime, '%y-%m') =?») .SetParameter (0, "2009-08"). /*Travel*/ for (iterator <object []> iter = studies.iterator (); iter.hasnext ();) {object [] obj = (Object []) iter.next (); System.out.println (obj [0] + "," + obj [1]); } SimpleDateFormat SDF = new SimpleDateFormat ("yyyy-mm-dd HH: MM: SS"); /*Студенты с 2009-08-01 по 2009-08-20 могут назвать функцию форматирования даты MySQL*/ list <Object []> Студент = Session.Createquery («Select S.Id, S.Name от студента S, где S.Createtime между? И?») .SetParameter (0, SDF.Parse ("2009-08-01 00:00:00:00". sdf.parse ("2009-08-20 23:59:59")) .list (); /*Transip*/ for (iterator <object []> iter = studies.iterator (); iter.hasnext ();) {object [] obj = (object []) iter.next (); System.out.println (obj [0] + "," + obj [1]); } / * Использовать SELECT * Вы должны использовать исходные операторы SQL, и это похоже на запросы HQL -запроса нескольких свойств, поэтому он возвращает коллекцию типов массива объектов */ list <Object []> Study = session.createSqlQuery («SELECT * From T_STUDENT"). LIST (); /*Transip*/ for (iterator <object []> iter = studies.iterator (); iter.hasnext ();) {object [] obj = (object []) iter.next (); System.out.println (obj [0] + "," + obj [1]); }Примечание. HQL не поддерживает форму запроса Select *, но Hibernate поддерживает исходные операторы SQL. Мы можем использовать операторы SQL для запроса. Кроме того, он похож на многочисленные атрибуты запроса HQL, поэтому он возвращает коллекцию типов массива объектов.
/*Запрос страницы, SetFirstresult (1) означает, что начинается с первых данных; SetMaxResult (2) означает, что 2 части данных отображаются на страницу*/ Список студентов = session.createequery («от студента») .setFirstresult (1) .SetMaxResults (2) .list (); /*Travel*/ for (iterator iter = Student.iterator (); iter.hasnext ();) {студент студента = (студент) iter.next (); System.out.println (Student.getName ()); } /*Навигационный запрос, s.classes.name vaigt от учащегося к классу в классе (это навигация от большего количества конец до меньшего конца, что также возможно)*/ list <toodt sturny = session.createequery («От студентов, где s.classes.name, как '%2%'») .list (); /*Travel*/ for (iterator <toold> iter = Student.iterator (); iter.hasnext ();) {Студент студент = (студент) iter.next (); System.out.println (Student.getName ()); }ПРИМЕЧАНИЕ. S.Classes.Name в приведенном выше утверждении запроса заключается в получении названия класса от навигации студентов до классов классов. Вы также можете ориентироваться в обратном порядке: перейдите из класса к студенту, чтобы получить определенный атрибут. Кроме того, заявление запроса в программе означает запрос всех студентов с 2 в названии класса.
/ *Внутренняя подключение, просто используйте ключевое слово join */ list <object []> studies = session.createquery («select c.name, s.name от unbine s.classes c") .list (); /*Транзакция*/ for (iterator <object []> iter = studies.iterator (); iter.hasnext ();) {object [] obj = (object []) iter.next (); System.out.println (obj [0] + "," + obj [1]); }Примечание. Ключевое слово во внутреннем соединении соединяется, и соединение все еще выполняется с помощью псевдонима и навигации. Приведенное выше оператор запроса означает: Запрос имя класса и имя студента из таблицы студентов и таблицы классов (внутренняя связь означает, что в запросе должны быть достойные атрибуты, такие как ни один класс или ни один из студентов или студентов не может запросить без классов).
/*Левое соединение использует ключевое слово левое соединение*/ list <object []> studies = session.createquery («select c.name, s.name из левого соединения студента s s.classes c") .list (); /*Transip*/ for (iterator <object []> iter = studies.iterator (); iter.hasnext ();) {object [] obj = (object []) iter.next (); System.out.println (obj [0] + "," + obj [1]); }Примечание. Ключевое слово, используемое для левого соединения, остается соединением. Вышеуказанное заявление запроса означает: из таблицы ученика и класса, запросите имя класса и имя студента. Поскольку это подключенное налево, студенты без класса также будут запрошены.
[java] Просмотр простой копии/*правое соединение Ключевое слово - правое соединение*/ list <object []> studies = session.createequery («select c.name, s.name из правого соединения студента s s.classes c") .list (); /*Transip*/ for (iterator <object []> iter = studies.iterator (); iter.hasnext ();) {object [] obj = (object []) iter.next (); System.out.println (obj [0] + "," + obj [1]); }Примечание. Ключевое слово с использованием правого соединения - правое соединение. Вышеуказанное заявление запроса означает: из таблицы ученика и класса, запросите имя класса и имя студента. Поскольку это подключенные к правым, классы без студентов будут запрошены.
Long count = (long) session.createequery («Выберите счет (*) от студента»). Uniqueresult ();
Примечание: только статистические запросы могут использоваться в HQL с *. Uniqueresult () означает, что существует только один набор результатов, и возвращаемый тип длиной.
/*Оператор запроса*/ string hql = "select c.name, count (ы) из классов C Присоединяйтесь к группе Straints S по порядку c.name по c.name"; List <Object []> Student = Session.CreateQuery (hql) .list (); /*Travel*/ for (int i = 0; i <students.size (); i ++) {Object [] obj = (Object []) Student.Get (i); System.out.println (obj [0] + "," + obj [1]); }Примечание: HQL также поддерживает группировку, сортировку и т. Д. Приведенное выше оператор означает: Запрос на имя каждого класса и запрашивайте количество студентов в каждом классе, группа по имени класс, сортировку по имени класс
Выше приведено пример кода HQL HQL Hibernate. В этой статье я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!