使用方法:JPQL或Criteria API?

yeg*_*256 66 java jpa jpql criteria-api jpa-2.0

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

Pas*_*ent 76

我很确定这已经在SO上面了,但我找不到现有的问题.所以,这是我对这个问题的看法:

  • 我发现JPQL查询更容易编写/读取.
  • 我发现Criteria API非常适合构建动态查询.

这基本上是你在Hibernate中可以找到的:Criteria vs. HQL.

但是JPA 2.0 Criteria API和值得一提的Hibernate Criteria API之间存在一个主要区别:JPA 2.0 Criteria API是一个类型安全的API,因此可以提供编译时间检查,代码完成,更好的重构支持等.但是,没有发现这些好处超过了JPQL的易用性.

总而言之,我赞成JPQL,除了动态查询(例如,对于多标准搜索功能).

相关问题

更多资源

  • @Shahzeb不,绝对没有.不要将标准API用于任何静态的 - 即如果可以在编译时将查询写为JPQL,则应使用JPQL.当然,不是在代码中撒上字符串的形式,应该避免这些; 但作为命名查询.这些在启动时解析,甚至在某些IDE的编辑时解析. (4认同)
  • 很抱歉恢复旧线程,但不应该尽可能避免`JPQL`.不是说使用JPQL是不好的做法,而是我只是说如果可以使用Criteria完成某些事情,那么应该用JPQL完成.我只是谦虚地向你寻求更多的澄清,而不是质疑你对JPQL的偏好而不是Criteria. (3认同)

sag*_*eta 6

我之前回答了类似的问题,为了社区的利益,我将在这里重新发布我的答案。我将假设您正在使用我下面的答案所对应的Application Server。

Criteria API的存在允许以防止SQL注入的类型安全的方式构造动态SQL查询。否则,您将把容易出错且存在安全风险的SQL字符串连接在一起:即SQL注入。那是您唯一想使用Criteria API的时间。

如果查询基本上保持相同,但只需要接受不同的参数,则应使用带注释的@NamedQueries,它们更简单,预编译,可以缓存在辅助缓存中,并且可以在服务器启动期间进行验证。

这基本上是关于“条件查询”与“ @NamedQueries”的经验法则。以我的经验,您很少需要Criteria API,但在极少数情况下需要它,这很好。

希望这可以帮助。

  • 连接常量字符串来创建 JPQL 查询没有安全风险。这正是 CriteriaBuilder 的作用。那么,除了使代码完全不可读和难以理解之外,CriteriaBuilder 的优点是什么? (2认同)