
jOOQ开箱即支持大量的SQL语法。因此,大多数用户在使用JDBC编写动态SQL时,不会像以前那样采用字符串连接的方式。 但时不时地,jOOQ不支持某个厂商的特定功能(是的,它发生了)。在这种情况下,jOOQ支持各种"普通SQL "API,它可以用来构造几乎所有类型的jOOQ API元素,比如。
-
- // Static import is implied, as always
- import static org.jooq.impl.DSL.*;
-
- // Column expressions
- Field<String> f = field("cool_function(1, 2, 3)", String.class);
-
- // Predicates
- Condition c = condition("col1
col2" ); -
- // Tables
- Table> t = table("wicked_table_valued_function(x, y)");
-
-
- 复制代码
但是,有时候,你需要动态地传递一个参数给这样的函数,比如说另一个列的表达式。而你想以一种类型安全的方式做到这一点,因为jOOQ代码生成器已经产生了类型安全的列表达式。所以你可能会倾向于串联,尽管如此。
-
- field("cool_function(1, " + MY_TABLE.MY_COLUMN + ", 3)");
-
-
- 复制代码
**千万不要这样做!**因为这些原因。
MY_TABLE.MY_COLUMN.toString() ,没有任何上下文信息,如SQLDialect 和所有其他配置标志。相反,使用jOOQ的普通SQL模板小语言,它允许模板占位符,如{0}, {1}, {2} 。
-
- field("cool_function(1, {0}, 3)", MY_TABLE.MY_COLUMN);
-
-
- 复制代码
如果你经常这样做,你可以在你自己的迷你DSL中考虑这个调用。
-
- public static Field<String> coolFunction(Field> field) {
- field("cool_function(1, {0}, 3)", field);
- }
-
-
- 复制代码
而现在,像这样调用。
-
- coolFunction(MY_TABLE.MY_COLUMN)
-
-
- 复制代码
作为一个经验法则:使用jOOQ,你应该永远不需要借助于SQL字符串连接,你可以始终使用以下两种方法。