Блог вебразработчика
  • ГЛАВНАЯ
  • ПОДПИСКА

Hibernate: запросы с использованием Criteria

Ноя27
2012
Написал Tatyana

Интерфейс org.hibernate.Criteria представляет собой объектно-ориентированный запрос на выборку в отношении конкретной сущности и позволяет выполнять запросы в БД без написания SQL кода. Использование Criteria является наиболее удачным подходом для интерфейсов поиска с переменным количеством условий. Для создания экземпляров Criteria используется класс Session, который выступает в качестве фабрики. Пример создания и обработки Criteria:

session.beginTransaction();
List<User> users = session.createCriteria(User.class)
					.setMaxResults(10)
					.list();
		
session.getTransaction().commit();
Запрос Criteria должен быть заключен в транзакцию также, как и другие действия с БД

Приведенный выше запрос вернет первые 10 записей из таблицы сущности User. setMaxResults представляет собой аналог команды LIMIT в SQL-запросе. Для того, чтобы выполнить LIMIT с определенной позиции (LIMIT 2,5) дополнительно используется метод setFirstResult:

List<User> users = session.createCriteria(User.class)
					.setFirstResult(2)
					.setMaxResults(5)
					.list();
		
Условия выборки

Для сужения выборки или, другими словами, задания условий выборки с помощью команды WHERE в SQL, используется класс org.hibernate.criterion.Restrictions:

List<User> users = 
			session.createCriteria(User.class)
				.add(Restrictions.eq("login", login))
				.list();	
List<User> users = 
			session.createCriteria(User.class)
				.add(Restrictions.like("name", "Jo", MatchMode.START))
				.add(Restrictions.between("weight", minWeight, maxWeight))
				.list();	

По умолчанию каждое добавленное ограничение присоединяется к условию выборки с операцией and. Ограничения также могут быть сгруппированы с помощью других логических операций:

List<User> users = session.createCriteria(User.class)
				.add(Restrictions.or(
						Restrictions.eq("login", "admin"),
						Restrictions.gt("rights", 2)
							))
				.add(Restrictions.lt("last_login_date", date))
				.list();	
List<User> users = session.createCriteria(User.class)
				.add(Restrictions.and(
						Restrictions.not(
							Restrictions.eq("login", "admin")
						),
						Restrictions.le("rights", 2)
						))
				.add(Restrictions.isNotNull("last_login_date"))
				.list();	

Используя класс Restrictions можно также задавать ограничения в виде SQL выражений:

List<User> users = session.createCriteria(User.class)
				.add(Restrictions.sqlRestriction(
					"date_registration < 
							DATE_SUB(CURDATE(),INTERVAL 3 MONTH)")
					)
				.list();	

Если в выборке участвуют несколько таблиц, то в SQL выражении можно использовать конструкцию {alias}, которая будет автоматически заменена псевдонимом из сущности (@Table(name = "users")):

List<User> users = session.createCriteria(User.class)
				.add(Restrictions.sqlRestriction(
					"(SELECT COUNT(*) FROM cars 
						WHERE user_id = {alias}.id) > 2"
					)
				)
				.setMaxResults(1)
				.list();
Сортировка выборки

Сортировка выборки осуществляется с помощью класса org.hibernate.criterion.Order. Класс Order представляет собой аналог SQL команды ORDER BY и также выполняет сортировку в двух направлениях asc(по возрастанию) и desc(по убыванию):

List<User> users = session.createCriteria(User.class)
				.addOrder(Order.desc("id"))
				.setMaxResults(1)
				.list();	
Выборка из связанных таблиц

В SQL запросах выборки из связанных таблиц происходят с использованием конструкции JOIN. Для связи таблиц при выборке в Hibernate можно использовать 2 варианта, которые на сегодняшний день практически никак не отличаются. Пример выборки приостановленных абонементов для vip-пользователей:

List<Abonement> abonements = session.createCriteria(Abonement.class)
				.add(Restrictions.eq("status", AbonementStatus.suspended))
				.createAlias("user", "user")
				.add(Restrictions.ge("user.status", UserStatus.vip))
				.setMaxResults(1)
				.list();
List<Abonement> abonements = session.createCriteria(Abonement.class)
				.add(Restrictions.eq("status", AbonementStatus.suspended))
				.createCriteria("user", "user")
				.add(Restrictions.ge("user.status", UserStatus.vip))
				.setMaxResults(1)
				.list();
При этом поле "user" в классе сущности Abonement должно быть
привязано к соответствующей таблице и полю

По умолчанию таблицы связываются конструкцией INNER JOIN, для определения типа связи можно использовать дополнительный параметр JoinType:

.createAlias("user", "user", JoinType.LEFT_OUTER_JOIN)
  • Нравится
  • Tweet

Опубликовано в Hibernate ORM - Помечено Hibernate
Рассказать всем Twitter Facebook Delicious StumbleUpon E-Mail
← Selenium WebDriver: перетаскивание элементов (Drag and drop)
Selenium WebDriver: логи браузера →

Warning: count(): Parameter must be an array or an object that implements Countable in /var/www/u0420283/data/www/internetka.in.ua/wp-includes/class-wp-comment-query.php on line 405

2 комментариев

  1. joub's Gravatar joub
    22.03.2014 at 20:21 | Permalink

    Очень помогло с простой связкой ManyToOne , а вот с ManyToMany — там где существует связанная таблица, там не очень понятно.
    Суда-бы пример биндов классов которые используются, со всеми аннотациями… было-бы очень хорошо.
    А вообще — зачет.

  2. Константин's Gravatar Константин
    24.06.2016 at 07:43 | Permalink

    Спасибо, через годы ты помогаешь другим 🙂
    Очень помог.

Свежие записи

  • WebDriver и SSL Untrusted certificate
  • Видеозапись выполнения тестов Selenium
  • Selenium WebDriver: basic авторизация
  • BrowserMob Proxy + Selenium: автоматизация сбора данных о производительности
  • Hibernate 4: UserType пользовательский тип данных (часть 2)

Поиск

Рубрики

  • Hibernate ORM
  • SEO
  • Разное
  • Тестирование
    • JUnit
    • Selenium
    • Thucydides

Метки

Actions AJAX Alert AutoIt ChromeDriver Exceptions ExpectedConditions FindElement FirefoxDriver Hibernate InternetExplorerDriver Java Javascript Jenkins JUnit4 Maven PageFactory Page Object RemoteWebDriver Select Selenium IDE Selenium Server Selenium WebDriver switchTo Thucydides WebDriverWait XPath Автоматизированное тестирование база данных заработок в сети сеть Интернет скорость продвижения сайта статейное продвижение услуги продвижения

Реклама


Donec in mi a arcu cursus commodo non ut metus. Nunc id eros ut augue consequat tempus ut non ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer pretium, erat sit amet scelerisque euismod, purus lectus convallis dui, eget imperdiet sapien est ut magna. Nullam elementum, tortor vitae pulvinar mattis, orci neque porta tortor, a feugiat nisi lacus quis diam. Ut gravida augue id est rutrum elementum. Mauris eget felis dolor. Phasellus ante ante, porttitor sit amet lobortis ut, suscipit id neque. Fusce hendrerit dolor nec odio eleifend in auctor enim cursus. Nullam fermentum pretium risus, in hendrerit nulla cursus sit amet. Fusce eu tempus elit. Ut tortor velit, aliquam in ornare vel, feugiat sed nibh. Donec fringilla est id odio lacinia vulputate. Donec nulla urna, congue sit amet pretium non, dictum at orci. Fusce neque sem, fermentum eu tempus nec, mattis venenatis sem. Proin scelerisque velit tristique urna mattis adipiscing. Proin mattis faucibus facilisis. Integer non lacus ac ligula accumsan convallis quis molestie erat. Curabitur imperdiet vestibulum vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris lacus ligula, hendrerit eget suscipit in, sollicitudin nec dui. Suspendisse euismod, lorem pretium gravida rhoncus, enim quam facilisis orci, nec volutpat nisi dolor id lacus. Proin dolor arcu, rutrum eget hendrerit vel, pharetra id elit. Nullam porta euismod suscipit. Pellentesque malesuada consequat sem, et auctor magna aliquam gravida. Nullam blandit dignissim iaculis. Suspendisse non diam nec augue scelerisque iaculis. Nam id dui sed lorem vulputate rhoncus eget eu tellus. In sit amet nisi nunc. Fusce sed aliquet sem. Aliquam sit amet metus metus.
Donec in mi a arcu cursus commodo non ut metus. Nunc id eros ut augue consequat tempus ut non ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer pretium, erat sit amet scelerisque euismod, purus lectus convallis dui, eget imperdiet sapien est ut magna. Nullam elementum, tortor vitae pulvinar mattis, orci neque porta tortor, a feugiat nisi lacus quis diam. Ut gravida augue id est rutrum elementum. Mauris eget felis dolor. Phasellus ante ante, porttitor sit amet lobortis ut, suscipit id neque. Fusce hendrerit dolor nec odio eleifend in auctor enim cursus. Nullam fermentum pretium risus, in hendrerit nulla cursus sit amet. Fusce eu tempus elit. Ut tortor velit, aliquam in ornare vel, feugiat sed nibh. Donec fringilla est id odio lacinia vulputate. Donec nulla urna, congue sit amet pretium non, dictum at orci. Fusce neque sem, fermentum eu tempus nec, mattis venenatis sem. Proin scelerisque velit tristique urna mattis adipiscing. Proin mattis faucibus facilisis. Integer non lacus ac ligula accumsan convallis quis molestie erat. Curabitur imperdiet vestibulum vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris lacus ligula, hendrerit eget suscipit in, sollicitudin nec dui. Suspendisse euismod, lorem pretium gravida rhoncus, enim quam facilisis orci, nec volutpat nisi dolor id lacus. Proin dolor arcu, rutrum eget hendrerit vel, pharetra id elit. Nullam porta euismod suscipit. Pellentesque malesuada consequat sem, et auctor magna aliquam gravida. Nullam blandit dignissim iaculis. Suspendisse non diam nec augue scelerisque iaculis. Nam id dui sed lorem vulputate rhoncus eget eu tellus. In sit amet nisi nunc. Fusce sed aliquet sem. Aliquam sit amet metus metus.
Donec in mi a arcu cursus commodo non ut metus. Nunc id eros ut augue consequat tempus ut non ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer pretium, erat sit amet scelerisque euismod, purus lectus convallis dui, eget imperdiet sapien est ut magna. Nullam elementum, tortor vitae pulvinar mattis, orci neque porta tortor, a feugiat nisi lacus quis diam. Ut gravida augue id est rutrum elementum. Mauris eget felis dolor. Phasellus ante ante, porttitor sit amet lobortis ut, suscipit id neque. Fusce hendrerit dolor nec odio eleifend in auctor enim cursus. Nullam fermentum pretium risus, in hendrerit nulla cursus sit amet. Fusce eu tempus elit. Ut tortor velit, aliquam in ornare vel, feugiat sed nibh. Donec fringilla est id odio lacinia vulputate. Donec nulla urna, congue sit amet pretium non, dictum at orci. Fusce neque sem, fermentum eu tempus nec, mattis venenatis sem. Proin scelerisque velit tristique urna mattis adipiscing. Proin mattis faucibus facilisis. Integer non lacus ac ligula accumsan convallis quis molestie erat. Curabitur imperdiet vestibulum vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris lacus ligula, hendrerit eget suscipit in, sollicitudin nec dui. Suspendisse euismod, lorem pretium gravida rhoncus, enim quam facilisis orci, nec volutpat nisi dolor id lacus. Proin dolor arcu, rutrum eget hendrerit vel, pharetra id elit. Nullam porta euismod suscipit. Pellentesque malesuada consequat sem, et auctor magna aliquam gravida. Nullam blandit dignissim iaculis. Suspendisse non diam nec augue scelerisque iaculis. Nam id dui sed lorem vulputate rhoncus eget eu tellus. In sit amet nisi nunc. Fusce sed aliquet sem. Aliquam sit amet metus metus.
Donec in mi a arcu cursus commodo non ut metus. Nunc id eros ut augue consequat tempus ut non ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer pretium, erat sit amet scelerisque euismod, purus lectus convallis dui, eget imperdiet sapien est ut magna. Nullam elementum, tortor vitae pulvinar mattis, orci neque porta tortor, a feugiat nisi lacus quis diam. Ut gravida augue id est rutrum elementum. Mauris eget felis dolor. Phasellus ante ante, porttitor sit amet lobortis ut, suscipit id neque. Fusce hendrerit dolor nec odio eleifend in auctor enim cursus. Nullam fermentum pretium risus, in hendrerit nulla cursus sit amet. Fusce eu tempus elit. Ut tortor velit, aliquam in ornare vel, feugiat sed nibh. Donec fringilla est id odio lacinia vulputate. Donec nulla urna, congue sit amet pretium non, dictum at orci. Fusce neque sem, fermentum eu tempus nec, mattis venenatis sem. Proin scelerisque velit tristique urna mattis adipiscing. Proin mattis faucibus facilisis. Integer non lacus ac ligula accumsan convallis quis molestie erat. Curabitur imperdiet vestibulum vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris lacus ligula, hendrerit eget suscipit in, sollicitudin nec dui. Suspendisse euismod, lorem pretium gravida rhoncus, enim quam facilisis orci, nec volutpat nisi dolor id lacus. Proin dolor arcu, rutrum eget hendrerit vel, pharetra id elit. Nullam porta euismod suscipit. Pellentesque malesuada consequat sem, et auctor magna aliquam gravida. Nullam blandit dignissim iaculis. Suspendisse non diam nec augue scelerisque iaculis. Nam id dui sed lorem vulputate rhoncus eget eu tellus. In sit amet nisi nunc. Fusce sed aliquet sem. Aliquam sit amet metus metus.

Блог вебразработчика
Функциональное тестирование и продвижение сайтов

Яндекс.Метрика