我习惯在Hibernate中使用Criteria API,只是看了JPA 2.0中的Criteria如何工作。
我最喜欢的Hibernate标准是我们必须轻松地与Criterions合作。
JPA Criteria对我来说似乎相当沉重,并不像Hibernate Criteria那样流畅。 对我来说,与Hibernate相比的一个主要好处似乎是使用了元模型(Entity_.java类),但是由于你必须维护2个类,或者添加一个注释处理器(尽管很容易),它仍然有点沉重。与maven插件集成)
我读过一篇关于SpringSource的博客,它允许使用“JPA Predicates”降低编写的复杂性,并且有点像Hibernate中的Criterions。
Querydsl项目似乎很有趣。
http://blog.springsource.com/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/
只是想知道,对于那些使用JPA2的人,你使用的是Criteria API还是对你来说有点太重了?
对于那些熟悉Hibernate Criteria并且现在正在使用JPA Criteria的人来说,你最喜欢Dowhich方法,为什么?
您是否考虑使用或使用Querydsl或Spring Specifications over JPA2等框架来构建查询谓词? 你认为这些框架已经足够成熟,可以被采用吗?
答案 0 :(得分:8)
不,不喜欢它,因为API缺乏表达能力和流畅性。是的QueryDSL在更少的代码中做同样的事情,更自然。出于这个原因,我们为JDO自己的类型安全查询API采用了相同的路径,并将其与JPA Criteria进行了比较 https://datanucleus.wordpress.com/2010/11/09/jdo-typesafe-vs-jpa-criteria/
答案 1 :(得分:8)
我只能提供偏见,因为我是Querydsl的维护者,但我认为Querydsl和Spring规范都足够成熟。两者都在JPA 2之上提供了一个薄层,Querydsl为查询构建提供了流畅的DSL,为DAO / Repository构建提供了Spring数据模式。
Querydsl的表现力与HQL / JPQL相当。
以下是一些JPA 2 Criteria查询及其Querydsl版本:http://source.mysema.com/forum/mvnforum/viewthread_thread,49
我们在论坛中提供快速错误修复周期和响应式支持。 Querydsl团队与Spring,DataNucleus和其他各方合作,改进了Java中类型安全查询的状态。
答案 2 :(得分:6)
我密切使用JPA标准构建器。我使用元模型,类型安全的变体,但这不是唯一的选择。如果要将JPA与其他框架进行比较,请不要计算需要生成元模型类的事实。对于相同的功能,您不会仅为了附加的好处。不过,我不会回到任何非类型安全的方法。
当你习惯它时,它使用起来非常简单,而且功能强大。
一个额外的好处:它是标准的。如:来自不同组织的多位专家就此达成一致。规范的质量是确定的,并且它仍在不断发展。并且您获得了多个实现(实际上,其中至少有两个在最流行的应用程序服务器中使用)。如果你采用随机框架,你可能不会这样做,这可能会或可能不能证明时间。
JPA2的一些例子:
Root<Person> personRoot = query.from(Person.class);
Path firstNamePath = personRoot.get(Person_.firstName);
Predicate firstNamePredicate = criteriaBuilder.equal(firstNamePath, "Roger");
query.where(firstNamePredicate);
你可以把所有这些都压缩到一行,但我大多选择不这样做,以获得100%清晰的代码和每行1个语句。
答案 3 :(得分:4)
我在我的项目中使用JPA2并且总是发现Criteria API有点过于复杂,特别是对于构建具有一些where条件的简单select语句。
所以我决定继续使用JPQL查询。也许Criteria API具有更强大的查询功能(除了一些其他优点)。