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

SQL渲染

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

每个 org.jooq.QueryPart 必须实现 accept(Context) 方法,将其 SQL 字符串渲染到 org.jooq.RenderContext。 此 RenderContext 有两个目的

  • 它提供有关 SQL 渲染“状态”的一些信息。
  • 它为在上下文的内部 java.lang.StringBuilder 上构建 SQL 字符串提供了一个通用 API

此处提供了 org.jooq.RenderContext API 的概述

// These methods are useful for generating unique aliases within a RenderContext (and thus within a Query)
String peekAlias();
String nextAlias();

// These methods return rendered SQL
String render();
String render(QueryPart part);

// These methods allow for fluent appending of SQL to the RenderContext's internal StringBuilder
RenderContext keyword(String keyword);
RenderContext literal(String literal);
RenderContext sql(String sql);
RenderContext sql(char sql);
RenderContext sql(int sql);
RenderContext sql(QueryPart part);

// These methods allow for controlling formatting of SQL, if the relevant Setting is active
RenderContext formatNewLine();
RenderContext formatSeparator();
RenderContext formatIndentStart();
RenderContext formatIndentStart(int indent);
RenderContext formatIndentLockStart();
RenderContext formatIndentEnd();
RenderContext formatIndentEnd(int indent);
RenderContext formatIndentLockEnd();

// These methods control the RenderContext's internal state
boolean       inline();
RenderContext inline(boolean inline);
boolean       qualify();
RenderContext qualify(boolean qualify);
boolean       namedParams();
RenderContext namedParams(boolean renderNamedParams);
CastMode      castMode();
RenderContext castMode(CastMode mode);
Boolean       cast();
RenderContext castModeSome(SQLDialect... dialects);

以下附加方法是从通用的 org.jooq.Context 继承的,该 Context 在 org.jooq.RenderContextorg.jooq.BindContext 之间共享

// These methods indicate whether fields or tables are being declared (MY_TABLE AS MY_ALIAS) or referenced (MY_ALIAS)
boolean declareFields();
Context declareFields(boolean declareFields);
boolean declareTables();
Context declareTables(boolean declareTables);

// These methods indicate whether a top-level query is being rendered, or a subquery
boolean subquery();
Context subquery(boolean subquery);

// These methods provide the bind value indices within the scope of the whole Context (and thus of the whole Query)
int nextIndex();
int peekIndex();

渲染 SQL 的示例

通过查看 jOOQ 对(简化的)CompareCondition 的内部表示,可以提供一个简单的示例。它用于任何比较两个字段的 org.jooq.Condition,例如这里的 AUTHOR.ID = BOOK.AUTHOR_ID 条件

-- [...]
FROM AUTHOR
JOIN BOOK ON AUTHOR.ID = BOOK.AUTHOR_ID
-- [...]

以下是 jOOQ 渲染此类条件的方式(简化示例)

@Override
public final void accept(Context<?> context) {
    // The CompareCondition delegates rendering of the Fields to the Fields
    // themselves and connects them using the Condition's comparator operator:
    context.visit(field1)
           .sql(" ")
           .keyword(comparator.toSQL())
           .sql(" ")
           .visit(field2);
}

请参阅手册中关于自定义 QueryParts纯 SQL QueryParts的部分,了解如何编写自己的查询部分以扩展 jOOQ。

反馈

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

The jOOQ Logo