使用jooq

时间:2016-09-16 07:26:22

标签: java sql arrays postgresql jooq

如何使用jooq在本机SQL中的postgreSQL函数中传递数组参数?

动态编译的函数名称,我想用字符串调用它:

dsl().execute(someFunction + "(?)", Arrays.asList(1, 2, 3));

函数接受类型为 integer []

的参数

我找到了丑陋的解决方案:

dsl().execute(someFunction + "(string_to_array(?, ',')::INT[])", Joiner.on(",").join(1, 2, 3));

我正在使用jooq版本3.6.4

1 个答案:

答案 0 :(得分:2)

不要使用字符串连接

您的两次尝试都使用字符串连接来生成函数调用:someFunction + "(?)"。虽然您可能完全控制这些字符串,但总是存在添加不必要的风险:

  • 语法错误
  • SQL注入漏洞

更好地使用jOOQ的内置模板机制:

dsl().execute("{0}({1})", DSL.name("someFunction"), bindValue);

此处记录了模板机制:http://www.jooq.org/doc/latest/manual/sql-building/queryparts/plain-sql-queryparts

传递数组绑定变量

这很容易。只需将绑定变量作为Java中的数组(不是列表)传递即可。例如:

dsl().execute("someFunction({0})", DSL.val(new Integer[] { 1, 2, 3 }));