可用版本: Dev (3.21) | 最新 (3.20) | 3.19 | 3.18 | 3.17 | 3.16 | 3.15 | 3.14 | 3.13 | 3.12 | 3.11

SQL解析器API

适用于 ✅ 开源版   ✅ 专业版   ✅ 企业版

目标

从历史上看,jOOQ 在 Java 中实现了一种 内部领域特定语言,它生成 SQL(一种外部领域特定语言),用于 JDBC。jOOQ API 由两部分组成:DSL API模型 API,其中 DSL API 在模型 API 之上为程序员添加了词法便利性,而模型 API 实际上只是一个 SQL 表达式树,类似于 SQL 解析器在任何数据库内部所做的事情。

有了这个解析器,整个 jOOQ 功能现在也将提供给任何不直接使用 jOOQ 的人,包括 JDBC 和/或 JPA 用户,例如,通过 解析连接,它在将所有 JDBC 连接调用转发到数据库之前,先将其代理到 jOOQ 解析器,或者通过 DSLContext.parser() API,它允许更低级别的直接访问解析器,例如,用于在 jOOQ 之上构建工具。

可能性是无限的,包括标准化的、基于 SQL 字符串的数据库迁移,这些迁移适用于 jOOQ 支持的任何 SQLDialect

示例

这个解析器 API 允许将任意 SQL 字符串片段解析为各种 jOOQ API 元素

请参阅这篇博客文章 了解有关各种 jOOQ 类型的更多信息

该解析器能够解析任何未指定的方言,以生成 SQL 表达式的 jOOQ 表示形式,例如

ResultQuery<?> query =
DSL.using(configuration)
   .parser()
   .parseResultQuery("SELECT * FROM (VALUES (1, 'a'), (2, 'b')) t(a, b)")

上面的 SQL 查询是有效的标准 SQL,可以在 PostgreSQL 和 SQL Server 等数据库上直接运行。但是,从此 SQL 字符串生成的 jOOQ ResultQuery 也适用于任何其他数据库,因为 jOOQ 可以模拟此处使用的两个有趣的 SQL 功能

查询在支持 VALUES() 但不支持派生列列表的 H2 数据库上可能会呈现如下

select
  t.a,
  t.b
from (
  (
    select
      null a,
      null b
    where 1 = 0
  )
  union all (
    select *
    from (values
      (1, 'a'),
      (2, 'b')
    ) t
  )
) t;

或者在 Oracle 上像这样,它不支持这两个功能

select
  t.a,
  t.b
from (
  (
    select
      null a,
      null b
    from dual
    where 1 = 0
  )
  union all (
    select *
    from (
      (
        select
          1,
          'a'
        from dual
      )
      union all (
        select
          2,
          'b'
        from dual
      )
    ) t
  )
) t;

反馈

您对此页面有任何反馈吗? 我们很乐意听到您的声音!

The jOOQ Logo