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

纯SQL QueryParts

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

如果您不需要将相当复杂的 QueryParts 集成到 jOOQ 中,那么使用简单的 纯 SQL 功能可能更安全,您可以为 jOOQ 提供嵌入式 SQL 的简单字符串表示形式。jOOQ API 中的纯 SQL 方法有两种形式。

  • method(String, Object...): 这是一种接受 SQL 字符串和一系列绑定值的方法,这些绑定值将被绑定到 SQL 字符串中包含的变量
  • method(String, QueryPart...): 这是一种接受 SQL 字符串和一系列 QueryParts 的方法,这些 QueryParts 将在其各自的占位符的位置“注入”到 SQL 字符串中

以上区别最好用一个例子来解释

// Plain SQL using bind values. The value 5 is bound to the first variable, "Animal Farm" to the second variable:
create.selectFrom(BOOK).where(
    "BOOK.ID = ? AND TITLE = ?",     // The SQL string containing bind value placeholders ("?")
    5,                               // The bind value at index 1
    "Animal Farm"                    // The bind value at index 2
).fetch();

// Plain SQL using embeddable QueryPart placeholders (counting from zero).
// The QueryPart "index" is substituted for the placeholder {0}, the QueryPart "title" for {1}
Field<Integer> id   = val(5);
Field<String> title = val("Animal Farm");
create.selectFrom(BOOK).where(
    "BOOK.ID = {0} AND TITLE = {1}", // The SQL string containing QueryPart placeholders ("{N}")
    id,                              // The QueryPart at index 0
    title                            // The QueryPart at index 1
).fetch();

请注意,由于历史原因,这两种 API 用法也可以混合使用,尽管不建议这样做,并且确切的行为未指定。

纯 SQL 模板规范

使用 QueryPart 占位符(或绑定值占位符)进行模板化需要在 SQL 字符串上应用简单的解析逻辑。jOOQ 模板解析器按照以下规则运行

  • 单行注释(在所有数据库中以 -- 开头,或在 MySQL 中以 # 开头)会被无修改地呈现。此类注释中的任何绑定变量或 QueryPart 占位符都会被忽略。
  • 多行注释(在所有数据库中以 /* 开头,以 */ 结尾)会被无修改地呈现。此类注释中的任何绑定变量或 QueryPart 占位符都会被忽略。
  • 字符串字面量(在所有数据库中以 ' 开头和结尾,所有数据库都支持通过复制来转义引号字符,例如:'',或者在 MySQL 中,如果 Settings.backslashEscaping 已启用,则通过转义为:\')会被无修改地呈现。此类注释中的任何绑定变量或 QueryPart 占位符都会被忽略。
  • 带引号的名称(在大多数数据库中以 " 开头和结尾,在 MySQL 中以 ` 开头,或在 T-SQL 数据库中以 [] 开头)会被无修改地呈现。此类注释中的任何绑定变量或 QueryPart 占位符都会被忽略。
  • JDBC 转义语法 ({fn ...}, {d ...}, {t ...}, {ts ...}) 会被无修改地呈现。此类注释中的任何绑定变量或 QueryPart 占位符都会被忽略。
  • 绑定变量占位符(?:name 用于命名绑定变量)将被匹配的绑定值替换,如果启用了内联,例如通过 Settings.statementType == STATIC_STATEMENT
  • QueryPart 占位符 ({number}) 将被匹配的 QueryPart 替换。
  • 关键字 ({identifier}) 被视为关键字,并根据 Settings.renderKeywordStyle 以正确的形式呈现。

模板工具

提供了各种 API 来创建用于上述模板机制的模板元素。这些工具可以在 org.jooq.impl.DSL 中找到

// Keywords (which are rendered according to Settings.renderKeywordStyle) can be specified as such:
public static Keyword keyword(String keyword) { ... }

// Identifiers / names (which are rendered according to Settings.renderNameStyle) can be specified as such:
public static Name name(String... qualifiedName) { ... }

// QueryPart lists (e.g. IN-lists for the IN predicate) can be generated via these methods:
public static QueryPart list(QueryPart... parts) { ... }
public static QueryPart list(Collection<? extends QueryPart> parts) { ... }

引用此页

反馈

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

The jOOQ Logo