2016-10-25 2 views
1

я хочу вызывать хранимые процедуры из PostgreSQL в JOOQ по имени динамически:Хранимые процедуры в jooq с динамическими именами

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 массив массивов объектов

Любые идеи?

+0

Есть ли причина, по которой вы не хотите использовать генератор кода для этого? Из-за сгенерированного имени функции? –

+0

Да, функции отчетов поступают от клиента, но без префикса, чтобы избежать выполнения какой-либо функции – Artem

+0

Я вижу, то вы * определенно * хотите перенести это имя в объект 'org.jooq.Name' для предотвращения SQL-инъекций, как я показал в моем ответе –

ответ

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.

Смежные вопросы