【问题标题】:Why do we need native SQL when we have HQL [closed]当我们有 HQL 时,为什么我们需要原生 SQL [关闭]
【发布时间】:2021-11-05 09:52:21
【问题描述】:

当我们有 HQL 时,为什么我们需要在 hibernate 中使用原生 SQL

谁能举例说明

【问题讨论】:

  • 仅仅是因为 Hibernate 不具备 SGBD(MySql、Oracle、PostgreSQL、...)提供的所有功能。 Hibernate 只使用千千万万之间最常见的。
  • 原因都是一样的,为什么不是所有的 DBMS 都完全符合 ANSI SQL,为什么每个 DBMS 都有自己的函数名和扩展,为什么相同的 SQL 语句可以有不同的更改来优化以加快处理速度特定的 DBMS。

标签: java sql hibernate


【解决方案1】:

HQL 只实现了 SQL 的一小部分。这个小子集对于 CRUD 类型的操作非常有用,但仅此而已。

另一方面,SQL 具有一组 HQL 不感兴趣的完整策略和运算符。当查询需要非常简单的解决方案时,典型的解决方法是避免使用 HQL,而是使用“本机 SQL”。

【讨论】:

    【解决方案2】:

    HQL 在内部转换为 SQL。 SQL 是与 SQL 数据库通信的标准方式。

    创建 HQL 是为了帮助 Java 开发人员编写 SQL。 Hibernate 在内部负责这种转换。

    每个数据库都有一些特定的功能是HQL无法使用的(例如Postgres数据库使用一些扩展,例如PostGIS,它有特定的方法),一些复杂的查询也很难用HQL编写。

    用 HQL 编写下面的查询几乎是不可能的(尽管有一些外部 JAR 可以通过变通方式完成,但不如这个简单)

    SELECT ST_AsText(ST_TRANSFORM(ST_GeomFromText(:geometry), :transformation, :toSrid))
    

    【讨论】:

    • 我想他们是在问“为什么我们可以在 hibernate 中使用原生 sql?hql 还不够吗?”
    • 是的,在我的回答中添加了更多详细信息。我误解了。感谢您纠正我。
    【解决方案3】:

    每个数据库都有不同的方言。如果您使用本机 sql,您可以使用特定数据库的方言进行查询。有时使用 hql 是不可能的。

    例如,您可以在 postgres 中使用 JSONB 类型,它是一种存储 json 的数据类型。您可以创建查询来访问标准 hql 无法访问的此 jsonb 字段的内容。

    例如以下查询:

    SELECT info -> 'customer' AS customer FROM orders;
    

    在字段 info 中存储的 json 中选择属性 customer。这在 hql 中没有等效项。

    【讨论】:

      猜你喜欢
      • 2011-05-27
      • 1970-01-01
      • 2014-07-04
      • 2023-01-24
      • 1970-01-01
      • 2015-07-11
      • 1970-01-01
      • 2016-09-24
      • 1970-01-01
      相关资源
      最近更新 更多