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