1.0jpa 2.0
在今天的帖子中,我们将看到名为EasyCriteria的框架的新版本。 在这篇文章的结尾,我们将在博客中看到这里的内容。 不幸的是,JPA标准存在一个巨大的问题,即冗长。 为什么不变得更容易? 像这样认为EasyCriteria框架已经诞生,并且现在已经在2.0版中。 要使用JPA标准进行简单的JPQL,需要以下代码:
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();
注意执行查询所需的所有代码:从Person p中选择p。 检查以下使用EasyCriteria进行相同条件的难易程度:
EasyCriteria<Person> easyCriteria = EasyCriteriaFactory.createQuery(entityManager, Person.class);
easyCriteria.getResultList();
1.0版和2.0版之间的区别在于将方法简化为通用方法。 要比较=,> =,<,<=和其他方法的方法,只需使用如下所示的API:
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”条件,而没有新的类。 下面看一下如何使用OR进行查询:
select s from Song s where s.id = 1 or s.length = 40 or s.artist = 'Group 1 Crew'
easyCriteria.orEquals('id', 1).orEquals('length', 40).orEquals('artist', 'Group 1 Crew');
可以执行另一种OR:
select s from Song s where (s.id = 1) or (s.id = 2) or (s.length = 40) or (s.artist = 'Group 1 Crew')
easyCriteria.orEquals('id', 1, 2).orEquals('length', 40).orEquals('artist', 'Group 1 Crew');
并且可以进行复杂查询,例如:
select s from Song s where (s.totalDownloads = 20 or s.weight = 10.00) and (s.price = 20.00 or s.type = :type)
easyCriteria.orEquals(1, 'totalDownloads', 20L).orEquals(1, 'weight', 10.00f).orEquals(2, 'price', 20.00d).orEquals(2, 'type', SongType.PRAISE);
将索引的想法添加到了与一组OR一起使用的API中。 第一个OR组由“ totalDownloads”和“ weight”组成,第二个组具有“ price”和“ type”作为元素。 作为默认索引,始终使用值1。 上面的标准可以写成:
easyCriteria.orEquals('totalDownloads', 20L).orEquals('weight', 10.00f).orEquals(2, 'price', 20.00d).orEquals(2, 'type', SongType.PRAISE);
可以创建一个查询来执行上述查询的逆运算,并以OR分隔AND:
select s from Song s where (s.id = 1 and s.name = 'Sing Out') or (s.id = 2 and s.name = 'Alive')
easyCriteria.addAndSeparatedByOr(1, 'id', 1).addAndSeparatedByOr(1, 'name', 'Sing Out').addAndSeparatedByOr(2, 'id', 2).addAndSeparatedByOr(2, 'name', 'Alive');
今天就这些了,希望您喜欢新版本。 认为此框架完整将需要很长时间。 我可以依靠JoãoNeves(http://about.me/joaonevesfilho)和Sasaki(http://curriculum.rodrigosasaki.com/)来帮助实现OR功能。 在这里可以看到框架的官方页面: http : //easycriteria.uaihebert.com/ 。 最好的是,它是开源的(http://code.google.com/p/easy-criteria/)。
关于框架的其他事实是,使用Cobertura进行的测试100%覆盖了该框架。 EasyCriteria已通过OpenJPA,EclipseLink和Hibernate进行了测试。 现在是时候寻求您的帮助了。 在测试的实现中发现错误; 如果您有5分钟的时间在bug中投票,那就太好了。 通过您的投票,可以更快地更正该错误。
- EclipseLink:https://bugs.eclipse.org/bugs/show_bug.cgi?id = 386354
- OpenJPA:https://issues.apache.org/jira/browse/OPENJPA-2333
- Hibernate:https://hibernate.onjira.com/browse/HHH-7985
博客中会有什么? 我写这篇文章花了很多时间,因为我正在写完第一本书。 如果神的旨意,这本书将在三月份发行。 在这里的新帖子暂停中,我研究了很多Maven,我希望我的下一篇文章是有关基本Maven和完整Web应用程序的迷你书。 是的,我说“申请”是复数形式。
参考: EasyCriteria 2.0 –在uaiHebert博客上,我们的JCG合作伙伴 Hebert Coelho 应该可以轻松制定JPA Criteria 。
翻译自: https://www.javacodegeeks.com/2013/02/easycriteria-2-0-jpa-criteria-should-be-easy.html
1.0jpa 2.0