提问者:小点点

带有限制和偏移的Jooq问题


我已经将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?'的正确语法

这清楚地表明传递给限制和偏移方法的值不会附加到查询中。

我搜索了留档,但没有找到任何其他方法来实现这一点。


共1个答案

匿名用户

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)