我已经将jooq与Spring集成在一起,对于所有类型的数据库查询(MySQL),我使用Spring的JDBC模板。这里使用jooq库来生成sql查询以传递给jdbc模板。
尽管我的其余查询工作正常,直到我向查询添加限制和/或偏移量。
我正在生成查询如下:
create.select(Factory.field("table_name"))
.from("tables t")
.where("t.table_schema LIKE '" + schemaName + "'")
.limit(10)
.offset(2)
.getSQL();
我得到的错误如下:
jdbc. BadSqlGrammarException:StatementCallback;错误的SQL语法[selecttable_namefrom table t where(t.table_schema像'test')limited?offset?];嵌套异常是com.mysql.jdbc.Exctions.jdbc4.MySQLSynaskErrorException:您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以获取在第1行附近使用'?offset?'的正确语法
这清楚地表明传递给限制和偏移方法的值不会附加到查询中。
我搜索了留档,但没有找到任何其他方法来实现这一点。
jOOQ使用绑定值生成SQL。当您使用jOOQ仅渲染SQL时,使用Spring执行它,您基本上可以使用以下任何选项:
像这样,您可以明确告诉jOOQ不要为您的LIMIT… OFFSET
子句呈现任何绑定变量
create.select(DSL.field("table_name"))
.from("tables t")
.where("t.table_schema LIKE '" + schemaName + "'")
.limit(DSL.inline(10))
.offset(DSL.inline(2))
.getSQL();
像这样,您可以告诉jOOQ根本不要呈现任何绑定变量:
Settings settings = new Settings();
settings.setStatementType(StatementType.STATIC_STATEMENT);
DSLContext create = DSL.using(connection, dialect, settings);
// [...]
像这样,您可以让jOOQ在适当的地方渲染绑定变量,并以正确的顺序提取它们:
Query query =
create.select(DSL.field("table_name"))
.from("tables t")
.where("t.table_schema LIKE '" + schemaName + "'")
.limit(DSL.inline(10))
.offset(DSL.inline(2));
String sql = query.getSQL();
List<Object> bindValues = query.getBindValues();
http://www.jooq.org/doc/latest/manual/sql-building/bind-values/
请注意,您的查询有点容易出错,因为schemaName
应该被检查和转义,以防它来自用户输入。您可以这样为它创建一个绑定值:
create.select(DSL.field("table_name"))
.from("tables t")
.where("t.table_schema LIKE ?", schemaName)