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.RenderContext 和 org.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。
反馈
您对此页面有任何反馈吗? 我们很乐意听到!