【问题标题】:Call postgres function with array param in jooq在jooq中使用数组参数调用postgres函数
【发布时间】:2017-01-24 08:32:28
【问题描述】:

如何使用 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 版

【问题讨论】:

    标签: java sql arrays postgresql jooq


    【解决方案1】:

    不要使用字符串连接

    您的两次尝试都使用字符串连接来产生函数调用: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 }));
    

    【讨论】:

    • 感谢您的回答!这是一个更好的方法。当然,我在代码中只使用整数数组和函数名,不会促进 SQL 注入。
    猜你喜欢
    • 2017-01-08
    • 2021-08-28
    • 1970-01-01
    • 2017-09-02
    • 2022-11-28
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多