使用啥:JPQL 或 Criteria API? [关闭]

Posted

技术标签:

【中文标题】使用啥:JPQL 或 Criteria API? [关闭]【英文标题】:What to use: JPQL or Criteria API? [closed]使用什么:JPQL 或 Criteria API? [关闭] 【发布时间】:2011-04-20 23:31:18 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

相关问题

Hibernate: Criteria vs. HQL What are some of the real world example where JPA2 Criteria API is more preferable?

更多资源

Hibernate Querying 102 : Criteria API

【讨论】:

抱歉恢复旧线程,但不应该尽可能避免JPQL。并不是说使用 JPQL 是不好的做法,而是我只是说是否可以使用 Criteria 来完成某些事情应该在没有 JPQL 的情况下完成。我只是谦虚地寻求您的更多澄清,而不是质疑您对 JPQL 的偏好而不是标准。 @Shahzeb 不,绝对不是。不要将条件 API 用于任何静态的东西 - 即,如果可以在编译时将查询编写为 JPQL,则应该使用 JPQL。不是以散布在代码中的字符串的形式,当然,这些是要避免的;但作为命名查询。某些 IDE 在启动时甚至在编辑时都会解析这些内容。【参考方案2】:

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

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

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

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

希望这会有所帮助。

【讨论】:

连接常量字符串以创建 JPQL 查询没有安全风险。这正是 CriteriaBuilder 所做的。那么CriteriaBuilder除了让代码完全不可读和不可理解之外还有什么优势呢?

以上是关于使用啥:JPQL 或 Criteria API? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

JPQL / Criteria API Order By MAX OneToMany 关联

JPA Criteria builder IN 子句查询

使用 JPQL 或条件 API 在省略某些字段的同时恢复具有相关实体的实体列表

JPQL 中的 timestampdiff 等效项(不使用标准)

DetachedCriteria criteria = DetachedCriteria.forClass(BugDetail.class);是啥意思

函数criteria是啥意思