Статьи

EasyCriteria 2.0 — JPA Критерии должны быть простыми

В сегодняшнем посте мы увидим новую версию фреймворка под названием EasyCriteria. В конце этого поста мы увидим, что будет здесь в блоге. К сожалению, у критериев JPA есть огромная проблема — его многословие. Почему бы не сделать проще? Думая так, что фреймворк EasyCriteria родился и теперь он на версии 2.0. Чтобы сделать простой JPQL с критериями JPA, потребуется следующий код:

1
2
3
4
5
CriteriaQuery<Person> criteriaQuery = criteriaBuilder.createQuery(Person.class);
Root<Person> root = criteriaQuery.from(Person.class);
criteriaQuery.select(root);
TypedQuery<Person> query = entityManager.createQuery(criteriaQuery);
query.getResultList();

Обратите внимание на весь код, необходимый для выполнения запроса: выберите p из Person p. Проверьте ниже, насколько легко выполнить те же критерии с EasyCriteria:

1
2
EasyCriteria<Person> easyCriteria = EasyCriteriaFactory.createQuery(entityManager, Person.class);
easyCriteria.getResultList();

Разница между версией 1.0 и версией 2.0 заключается в редукции методов в общие методы. Для сравнения методов с =,> =, <, <= и другими методами просто используйте API, как показано ниже:

01
02
03
04
05
06
07
08
09
10
11
12
13
easyCriteria.andGreaterThan('hairSize', 10.4f); // >
 
easyCriteria.andGreaterOrEqualTo('height', 11.00d); // >=
 
easyCriteria.andLessThan('totalBooksOwned', 30L); // <
 
easyCriteria.andLessOrEqualTo('firstJobDate', firstJobDate); // <=
 
easyCriteria.andJoinEquals('dogs', 'age', 15); // =
 
easyCriteria.andJoinStringIn('dogs', 'name', names); // value in (x, i, z, ...)
 
easyCriteria.andJoinStringLike('dogs', 'name', '%y');

Одним из идеалов инфраструктуры EasyCriteria является предоставление пользователю как можно меньшего числа API. Думая так, EasyCriteria добавил условие «ИЛИ» в свой API без новых классов. Посмотрите ниже, чтобы узнать, как выполнять запросы с помощью OR:

1
select s from Song s where s.id = 1 or s.length = 40 or s.artist = 'Group 1 Crew'
1
easyCriteria.orEquals('id', 1).orEquals('length', 40).orEquals('artist', 'Group 1 Crew');

Можно сделать еще один тип ИЛИ:

1
select s from Song s where (s.id = 1) or (s.id = 2) or (s.length = 40) or (s.artist = 'Group 1 Crew')
1
easyCriteria.orEquals('id', 1, 2).orEquals('length', 40).orEquals('artist', 'Group 1 Crew');

И можно делать сложные запросы, например:

1
select s from Song s where (s.totalDownloads = 20 or s.weight = 10.00) and (s.price = 20.00 or s.type = :type)
1
easyCriteria.orEquals(1, 'totalDownloads', 20L).orEquals(1, 'weight', 10.00f).orEquals(2, 'price', 20.00d).orEquals(2, 'type', SongType.PRAISE);

Идея индекса была добавлена ​​в API для использования с группой ИЛИ. Первая группа ИЛИ состоит из «totalDownloads» и «weight», вторая группа имеет «price» и «type» в качестве элементов. В качестве индекса по умолчанию всегда используется значение 1. Приведенные выше критерии могут быть записаны как:

1
easyCriteria.orEquals('totalDownloads', 20L).orEquals('weight', 10.00f).orEquals(2, 'price', 20.00d).orEquals(2, 'type', SongType.PRAISE);

Можно создать запрос, чтобы сделать обратный запрос выше, И разделить ИЛИ:

1
select s from Song s where (s.id = 1 and s.name = 'Sing Out') or (s.id = 2 and s.name = 'Alive')
1
easyCriteria.addAndSeparatedByOr(1, 'id', 1).addAndSeparatedByOr(1, 'name', 'Sing Out').addAndSeparatedByOr(2, 'id', 2).addAndSeparatedByOr(2, 'name', 'Alive');

Это все на сегодня, надеюсь, вам понравится новая версия. Это займет много времени, чтобы считать эту структуру завершенной. Помогая с функциональностью ИЛИ, я мог рассчитывать на Жоао Невеса (http://about.me/joaonevesfilho) и Сасаки (http://curriculum.rodrigosasaki.com/). Здесь можно увидеть официальную страницу фреймворка: http://easycriteria.uaihebert.com/ . И самое лучшее, это открытый код (http://code.google.com/p/easy-criteria/).

Другой факт, касающийся фреймворка, состоит в том, что он на 100% покрыт тестами с использованием Cobertura. EasyCriteria была протестирована с OpenJPA, EclipseLink и Hibernate. Теперь пришло время обратиться за помощью. Были найдены ошибки в проверенных реализациях; было бы замечательно, если бы вы потратили 5 минут своего времени на голосование за ошибки. С вашим голосованием ошибка может быть исправлена ​​быстрее.

  • EclipseLink: https://bugs.eclipse.org/bugs/show_bug.cgi?id=386354
  • OpenJPA: https://issues.apache.org/jira/browse/OPENJPA-2333
  • Спящий режим: https://hibernate.onjira.com/browse/HHH-7985

Что будет в блоге? Мне понадобилось так много времени, чтобы написать этот пост, потому что я заканчиваю свою первую книгу. Если воля Божья, книга выйдет в марте. В этой паузе новых постов я много изучал Maven и хочу, чтобы мой следующий пост был о мини-книге о базовых Maven и полнофункциональных веб-приложениях. Да, я сказал «приложения» во множественном числе.

Ссылка: EasyCriteria 2.0 — JPA Criteria должно быть легко от нашего партнера JCG Хеберта Коэльо в блоге uaiHebert .