可用版本: 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 允许您将 SQL 作为字符串嵌入到任何受支持的语句中,在以下上下文中

普通 SQL API 方法通常以三种方式重载。 让我们看一下 condition 查询部分构造函数

// Construct a condition without bind values
// Example: condition("a = b")
@PlainSQL
Condition condition(String sql);

// Construct a condition with bind values
// Example: condition("a = ?", 1);
@PlainSQL
Condition condition(String sql, Object... bindings);

// Construct a condition taking other jOOQ object arguments
// Example: condition("a = {0}", val(1));
@PlainSQL
Condition condition(String sql, QueryPart... parts);
请注意 @PlainSQL 注释,它可以与jOOQ checker 一起使用,以完全禁止或局部禁止使用普通 SQL API,从而提高 SQL 注入保护。

绑定值和查询部分参数重载都支持 jOOQ 的普通 SQL 模板语言。 有关更多详细信息,请参阅org.jooq.impl.DSL Javadoc。

以下是来自 DSL 的普通 SQL 构造方法的更完整的列表

// A condition
Condition condition(String sql);
Condition condition(String sql, Object... bindings);
Condition condition(String sql, QueryPart... parts);

// A field with an unknown data type
Field<Object> field(String sql);
Field<Object> field(String sql, Object... bindings);
Field<Object> field(String sql, QueryPart... parts);

// A field with a known data type
<T> Field<T> field(String sql, Class<T> type);
<T> Field<T> field(String sql, Class<T> type, Object... bindings);
<T> Field<T> field(String sql, Class<T> type, QueryPart... parts);
<T> Field<T> field(String sql, DataType<T> type);
<T> Field<T> field(String sql, DataType<T> type, Object... bindings);
<T> Field<T> field(String sql, DataType<T> type, QueryPart... parts);

// A field with a known name (properly escaped)
Field<Object> field(Name name);
<T> Field<T>  field(Name name, Class<T> type);
<T> Field<T>  field(Name name, DataType<T> type);

// A function
<T> Field<T> function(String name, Class<T> type, Field<?>... arguments);
<T> Field<T> function(String name, DataType<T> type, Field<?>... arguments);

// A table
Table<?> table(String sql);
Table<?> table(String sql, Object... bindings);
Table<?> table(String sql, QueryPart... parts);

// A table with a known name (properly escaped)
Table<Record> table(Name name);

// A query without results (update, insert, etc)
Query query(String sql);
Query query(String sql, Object... bindings);
Query query(String sql, QueryPart... parts);

// A query with results
ResultQuery<Record> resultQuery(String sql);
ResultQuery<Record> resultQuery(String sql, Object... bindings);
ResultQuery<Record> resultQuery(String sql, QueryPart... parts);

// A query with results. This is the same as resultQuery(...).fetch();
Result<Record> fetch(String sql);
Result<Record> fetch(String sql, Object... bindings);
Result<Record> fetch(String sql, QueryPart... parts);

除了通用工厂方法之外,为了方便起见,普通 SQL 也在各种其他上下文中可用。 例如,当向查询添加 .where("a = b") 子句时。 因此,存在几种方便的方法,可以在其中有效地插入普通 SQL。 这是一个在一个查询中显示所有各种用例的示例

// You can use your table aliases in plain SQL fields
// As long as that will produce syntactically correct SQL
Field<?> LAST_NAME    = field("a.LAST_NAME");

// You can alias your plain SQL fields
Field<?> COUNT1       = field("count(*) x");

// If you know a reasonable Java type for your field, you
// can also provide jOOQ with that type
Field<Integer> COUNT2 = field("count(*) y", Integer.class);

       // Use plain SQL as select fields
create.select(LAST_NAME, COUNT1, COUNT2)

       // Use plain SQL as aliased tables (be aware of syntax!)
      .from("author a")
      .join("book b")

       // Use plain SQL for conditions both in JOIN and WHERE clauses
      .on("a.id = b.author_id")

       // Bind a variable in plain SQL
      .where("b.title != ?", "Brida")

       // Use plain SQL again as fields in GROUP BY and ORDER BY clauses
      .groupBy(LAST_NAME)
      .orderBy(LAST_NAME)
      .fetch();

关于普通 SQL 的重要说明!

使用普通 SQL 时,需要记住一些重要事项

  • 您必须提供一些在语法上正确的东西。 如果不是,那么 jOOQ 将不会知道。 只有您的 JDBC 驱动程序或您的 RDBMS 才会检测到语法错误。
  • 当您使用变量绑定时,必须提供一致性。 ? 的数量必须与变量的数量匹配
  • 您的 SQL 将插入到 jOOQ 查询中,无需进一步检查。 因此,jOOQ 无法阻止 SQL 注入或以任何方式转换您的 SQL 字符串。

引用此页

反馈

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

The jOOQ Logo