Давайте поговорим о критериях запроса, который легко для нас, программистов, которые не очень знакомы с заявлениями SQL.
Без лишних слов давайте посмотрим на пример:
Класс сущности выглядит следующим образом:
Пользователь открытого класса реализует Serializable {Private Static Long Long SerialVersionUID = 1L; Public Long Id; Приватное название строки; частный int возраст; // Опустить метод get/set} Мы не будем писать файл отображения, это очень простая сущность. Если вы не понимаете детскую обувь, пожалуйста, обратитесь к моим другим статьям в категории Hibernate.
Далее, давайте посмотрим, как использовать критерии для запроса:
public static void main (string [] args) {configuration cfg = new configuration (). configure (); SessionFactory SessionFactory = cfg.BuildSessionFactory (); Session Session = sessionFactory.Opensession (); Критерии критериев = session.createCriteria (user.class); Criteria.Add (RELICTIONS.EQ («Имя», «Шун»)); Список списка = Criteria.list (); Iterator iter = list.iterator (); while (iter.hasnext ()) {user user = (user) iter.next (); System.out.println (user.getName ()+":"+user.getage ()); } session.close (); } Видя код, это очень простая строка.
Мы все знакомы с предыдущими, и мы видим код после построения сеанса:
Критерии критериев = session.createCriteria (user.class); Criteria.Add (RELICTIONS.EQ («Имя», «Шун»));
Эти два предложения кода являются ключевыми моментами. Давайте проанализируем, что именно это означает?
В первом предложении мы получаем объект класса реализации критериев через сеанс, а во втором предложении мы добавляем условие с помощью метода добавления, а уравнение представляет равенство. Hibernate3 ранее был реализован через Expression.eq. После 3, поскольку критерии были заброшены, мы использовали класс ограничений для его реализации, что такое же, как и выражение. Давайте посмотрим на API и обнаружим, что выражение наследует от ограничений.
Возвращаясь к нашим двум предложениям выше, после того, как мы выполнили эти задачи, Hibernate фактически помог нам построить аналогичные
выберите * из пользователя, где имя = 'Shun'
Такое утверждение. (Здесь таблица, соответствующая классу пользователя в нашем файле отображения, является таблицей пользователя, а атрибут имени соответствует поле «Имя»)
Ограничения также имеют много методов, которые помогут нам построить заявления SQL. Это легко понять после проверки API.
Давайте повторно взглянем на приведенный выше код. Если мы закроем сеанс, но мы хотим продолжать использовать эти критерии, это нормально? Давайте посмотрим.
После приведенного выше кода мы переоцениваем, добавив:
Список списка2 = критерии.list (); Итератор iter2 = list.iterator (); while (iter.hasnext ()) {user user = (user) iter.next (); System.out.println (user.getName ()+":"+user.getage ()); } Чтобы различить разницу между предыдущим списком и ITER, мы используем здесь еще один.
Запустите его, и мы получаем исключение:
org.hibernate.sessionException: сеанс закрыт!
Сообщение об этом исключении означает, что сессия была закрыта. Во многих случаях мы сообщим о аналогичных исключениях после закрытия сеанса, а затем выполняем операции, связанные с SavtorUpdate, Save и т. Д.
Hibernate3 учитывает наши потребности и реализует отдельную критерию, которая может существовать независимо от сеанса.
Давайте посмотрим на пример: (сущность все еще выше)
public static void main (string [] args) {configuration cfg = new configuration (). configure (); SessionFactory SessionFactory = cfg.BuildSessionFactory (); Session Session = sessionFactory.Opensession (); DESTACHEDCRITERIA DEDITERIA = DESTACHEDCRITERIA.FORCLASS (user.class); Demiteria.Add (RELICTIONS.EQ («Имя», «Шун»)); Список списка = decriteria.getExeCutableCriteria (session) .list (); Iterator iter = list.iterator (); while (iter.hasnext ()) {user user = (user) iter.next (); System.out.println (user.getName ()+":"+user.getage ()); } session.close (); Session2 = sessionFactory.Opensession (); List2 = Deciteria.getExeCutableCriteria (Session2) .list (); Итератор iter2 = list2.iterator (); while (iter2.hasnext ()) {user user = (user) iter2.next (); System.out.println (user.getName ()+":"+user.getage ()); }} Мы видим, что после закрытия сеанса мы можем продолжать использовать отдельную критерию в другой связи. Нам необходимо связать текущую отдельную критерию с определенным сеансом через GetExeCutableCriteria (сеанс сеанса).
Далее, давайте посмотрим на сочетание класса подборов и отдельной критерии:
public static void main (string [] args) {configuration cfg = new configuration (). configure (); SessionFactory SessionFactory = cfg.BuildSessionFactory (); Session Session = sessionFactory.Opensession (); DESTACHEDCRITERIA DEDITERIA = DESTACHEDCRITERIA.FORCLASS (user.class); Decriteria.SetProjection (Projections.Avg («Возраст»)); Критерии критериев = session.createCriteria (user.class); Criteria.add (subqueries.propertygt («Возраст», некрасья)); Список списка = Criteria.list (); Iterator iter = list.iterator (); while (iter.hasnext ()) {user user = (user) iter.next (); System.out.println (user.getName ()+":"+user.getage ()); } session.close (); } Я предполагаю, что первое предложение кода у вас есть вопросы:
Decriteria.SetProjection (Projections.Avg («Возраст»));
Этот код относится к получению среднего значения возраста за счет некрасивов. Затем получите объект с возрастом, превышающим среднее значение ниже.
Проекции содержит много методов инкапсуляции, которые реализуют методы SQL. Вы можете взглянуть на API.
Давайте узнаем о его немного более продвинутом использовании.
Просто посмотрите на код:
Criteria.setfirstresult (10); Criteria.setMaxResults (20);
Здесь мы установили начальную запись в качестве статьи 10, а затем находим 20 записей из статьи 10. Согласно этой практике, мы можем реализовать основную функцию подкисления.
Конечно, нам нужна сортировка во многих случаях, и критерии также поддерживают ее:
Criteria.addorder (order.desc ("age")); Здесь мы можем напрямую использовать метод дополнения и получить объект заказа через order.desc, который требует параметра атрибута. На самом деле, когда мы называем дополнение, Hibernate поможет нам генерировать порядок по возрасту, такое утверждение.
Как мы делаем это, когда нам нужно это сгруппировать? Это требует метода Groupproperty класса прогнозов, который мы упоминали в прошлый раз.
Criteria.SetProjection (Projections.groupproperty («Возраст»));
Здесь мы группируемся в соответствии с возрастным атрибутом, который фактически сгруппируется в полевой возраст, соответствующий возрасту. Hibernate автоматически преобразует его в такое заявление, как группа по возрасту.
В проекциях есть много практических методов (обратите внимание, что это доступно только после Hibernate 3).