В сегодняшнем посте мы увидим новую версию фреймворка под названием 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 .