使用什么: JPQL 还是 Criteria API?

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

30261 次浏览

我很肯定这已经涵盖在这里所以,但我不能找到现有的问题。因此,我对这个问题的看法是:

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

这基本上就是你会在 Hibernate: Criteria vs. HQL中找到的。

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

总之,我倾向于 JPQL,除了动态查询(例如多条件搜索特性)。

相关问题

更多资源

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

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

如果查询基本上保持不变,但只需要接受不同的参数,那么应该使用带注释的 @NamedQueries,这种 @NamedQueries更简单,预编译,可以缓存在辅助缓存中,并且可能在服务器启动时进行验证。

这基本上是关于 Criteria Query 和 @NamedQueries的经验法则。根据我的经验,您很少需要 Criteria API,但是它存在于那些极少数需要它的时候是件好事。

希望这个能帮上忙。