代码之家  ›  专栏  ›  技术社区  ›  Artem

在jooq中使用数组param调用postgres函数

  •  2
  • Artem  · 技术社区  · 8 年前

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

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

    函数采用类型为的参数 整数[]

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

    我正在使用jooq 3.6.4版

    1 回复  |  直到 8 年前
        1
  •  2
  •   Lukas Eder    8 年前

    不使用字符串串联

    两次尝试都使用字符串串联来生成函数调用: 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中,只需将bind变量作为数组(而不是列表)传递。例如:

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