【问题标题】:Stored procedures in jooq with dynamic namesjooq中具有动态名称的存储过程
【发布时间】:2016-10-25 12:01:40
【问题描述】:

我想在 JOOQ 中通过名称动态调用 PostgreSQL 中的存储过程:

final Field function = function("report_" + name, Object.class, (Field[])params.toArray(new Field[params.size()]));

dsl().select(function).fetchArrays();

例如它生成:

select report_total_requests('83.84.85.3184');

返回:

 report_total_requests 
-----------------------
 (3683,2111,0)
 (29303,10644,1)

在 java 中它是“(3683,2111,0)”对象的数组。

我要生成:

select * from report_total_requests('83.84.85.3184')

生产:

total | users | priority 
------+-------+----------
 3683 |  2111 |        0
29303 | 10644 |        1

这是在java数组中的对象数组

有什么想法吗?

【问题讨论】:

  • 您有什么理由不想为此使用代码生成器吗?因为生成的函数名?
  • 是的,报表函数来自客户端,但不带前缀以避免执行任何函数
  • 我明白了,那么您肯定想将该名称包装到 org.jooq.Name 对象中以防止 SQL 注入,正如我在回答中所展示的那样

标签: java postgresql stored-procedures jooq


【解决方案1】:

前进的方向是使用plain SQL,如下所示:

Name name = DSL.name("report_" + name);
QueryPart arguments = DSL.list(params);
dsl().select().from("{0}({1})", name, arguments).fetch();

注意,我已将函数名称包装在 DSL.name() 对象中,以防止 SQL 注入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 2023-04-06
    • 2012-09-19
    • 2018-07-12
    • 2017-09-18
    • 1970-01-01
    相关资源
    最近更新 更多