使用什么:JPQL还是Criteria API?

72
我的Java应用程序使用JPA进行对象持久化。业务域非常简单(只有三个类是持久化的,在每个类中有3-5个属性)。查询也很简单。问题是我应该使用哪种方法:JPQL还是Criteria API?
2个回答

87

我相信这个问题在SO上已经有了答案,但我找不到现有的问题。所以,这是我对这个问题的看法:

  • 我发现使用JPQL查询更易于编写/阅读。
  • 我发现Criteria API适用于构建动态查询。

这基本上就是你会在Hibernate: Criteria vs. HQL中发现的内容。

但是,JPA 2.0 Criteria API和Hibernate的Criteria API之间有一个主要区别值得一提:JPA 2.0 Criteria API是类型安全API,因此提供编译时检查、代码完成、更好的重构支持等功能。 然而,我认为这些好处并不超过JPQL易用性带来的便利。

总之,除了动态查询(例如用于多条件搜索功能)外,我更喜欢JPQL。

相关问题

更多资源


4
抱歉搬起老帖子,但应该尽可能避免使用JPQL。并不是说使用JPQL是不好的做法,而是如果能用Criteria完成某些事情,就应该不用JPQL。我只是谦虚地向您请教更多的澄清问题,而不是质疑您对JPQL优于Criteria的偏好。 - Shahzeb
5
不,绝对不行。不要使用标准 API 处理任何静态内容 —— 即如果可以在编译时将查询写成 JPQL,请使用 JPQL。当然,不要将它们以代码中随意散布的字符串形式出现,而是使用命名查询。这些查询会在启动时进行解析,甚至某些 IDE 在编辑时也能解析。请注意不要改变原来的意思。 - Hauke Ingmar Schmidt

10

我之前回答过类似的问题,现在我将我的回答再次发表在这里,以造福社区。我假设您正在使用应用服务器,如下面的答案所示。

Criteria API存在是为了以类型安全的方式构建动态SQL查询,以防止SQL注入。否则,您将会将SQL字符串串联在一起,这既容易出错又存在安全风险:即SQL注入。只有在这种情况下,您才需要使用Criteria API。

如果查询基本上保持不变,但需要接受不同的参数,则应使用带注释的@NamedQueries,这些查询更简单、预编译,可以在二级缓存中缓存,并可能在服务器启动期间进行验证。

基本上,这就是关于Criteria Queries与@NamedQueries的经验法则。根据我的经验,很少需要使用Criteria API,但它存在于那些需要它的罕见时刻。

希望这可以帮到您。


2
将常量字符串连接起来创建JPQL查询并不会带来安全风险。这正是CriteriaBuilder所做的。那么,CriteriaBuilder的优势是什么呢?除了使代码完全难以阅读和理解之外? - bebbo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接