71

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

4

2 回答 2

85

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

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

这基本上就是您在Hibernate 中可以找到的内容:Criteria vs. HQL

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

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

相关问题

更多资源

于 2010-10-04T20:17:53.847 回答
10

我之前回答了一个类似的问题,为了社区的利益,我将在这里重新发布我的答案。我将假设您正在使用应用程序服务器,而不是我在下面的答案。

存在 Criteria API 以允许以防止 SQL 注入的类型安全方式构建动态 SQL 查询。否则,您会将 SQL 字符串连接在一起,这既容易出错又存在安全风险:即 SQL 注入。那将是您唯一需要使用 Criteria API 的时候。

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

这基本上是关于 Criteria Queries 与@NamedQueries. 根据我的经验,您很少需要 Criteria API,但它在极少数情况下需要它是件好事。

希望这可以帮助。

于 2016-01-30T20:20:17.427 回答