使用 JOOQ 从 table 值的 Postgresql 函数获取结果
Getting results from table-valued Postgresql function with JOOQ
我有一个 Postgresql 函数 returns Table
CREATE OR REPLACE FUNCTION test_func(IN param1 text, IN param2 integer)
RETURNS TABLE(result1 text, result2 integer) AS
$BODY$
BEGIN
result1 := 'aa';
result2 :=1;
return next;
result1 := 'bb';
result2 :=2;
return next;
END
$BODY$
LANGUAGE plpgsql
在 pg-admin 中查询 returns 正确结果
select * from test_func('aaa', 23);
result1 | result2
"aa" | 1
"bb" | 2
JOOQ一如既往地生成函数
...
public class TestFunc extends org.jooq.impl.AbstractRoutine<java.lang.Void> {
...
public TestFunc() {
super("test_func", ee.tavex.tavexwise.db.public_.Public.PUBLIC);
addInParameter(PARAM1);
addInParameter(PARAM2);
addOutParameter(RESULT1);
addOutParameter(RESULT2);
}
...
在例程中 class
...
public static ee.tavex.tavexwise.db.public_.routines.TestFunc testFunc(org.jooq.Configuration configuration, java.lang.String param1, java.lang.Integer param2) {
ee.tavex.tavexwise.db.public_.routines.TestFunc p = new ee.tavex.tavexwise.db.public_.routines.TestFunc();
p.setParam1(param1);
p.setParam2(param2);
p.execute(configuration);
return p;
}
我这样称呼它
TestFunc records = Routines.testFunc(dslConfiguration, "xx", 10);
records.getResults() //returns empty List
records.getResult1() //returns "aa"
records.getResult2() //returns 1
所以,它正确 returns 第一行的值,但我怎样才能得到整个 table?
(jooq 3.5.0)
从 jOOQ 调用 table 值函数的正确方法是在您链接的 FROM
子句 as documented in the manual page 中使用它们。
在你的情况下,那将是:
Result<TestFuncRecord> result =
DSL.using(configuration)
.selectFrom(Routines.testFunc("xx", 10))
.fetch();
或者也从 jOOQ 3.6 开始
Result<TestFuncRecord> result =
DSL.using(configuration)
.selectFrom(Tables.TEST_FUNC("xx", 10))
.fetch();
jOOQ 代码生成器将 table 值函数视为普通 tables,而不是例程。这就是为什么 Routines
中不应有采用 Configuration
参数的方法。
我有一个 Postgresql 函数 returns Table
CREATE OR REPLACE FUNCTION test_func(IN param1 text, IN param2 integer)
RETURNS TABLE(result1 text, result2 integer) AS
$BODY$
BEGIN
result1 := 'aa';
result2 :=1;
return next;
result1 := 'bb';
result2 :=2;
return next;
END
$BODY$
LANGUAGE plpgsql
在 pg-admin 中查询 returns 正确结果
select * from test_func('aaa', 23);
result1 | result2
"aa" | 1
"bb" | 2
JOOQ一如既往地生成函数
...
public class TestFunc extends org.jooq.impl.AbstractRoutine<java.lang.Void> {
...
public TestFunc() {
super("test_func", ee.tavex.tavexwise.db.public_.Public.PUBLIC);
addInParameter(PARAM1);
addInParameter(PARAM2);
addOutParameter(RESULT1);
addOutParameter(RESULT2);
}
...
在例程中 class
...
public static ee.tavex.tavexwise.db.public_.routines.TestFunc testFunc(org.jooq.Configuration configuration, java.lang.String param1, java.lang.Integer param2) {
ee.tavex.tavexwise.db.public_.routines.TestFunc p = new ee.tavex.tavexwise.db.public_.routines.TestFunc();
p.setParam1(param1);
p.setParam2(param2);
p.execute(configuration);
return p;
}
我这样称呼它
TestFunc records = Routines.testFunc(dslConfiguration, "xx", 10);
records.getResults() //returns empty List
records.getResult1() //returns "aa"
records.getResult2() //returns 1
所以,它正确 returns 第一行的值,但我怎样才能得到整个 table?
(jooq 3.5.0)
从 jOOQ 调用 table 值函数的正确方法是在您链接的 FROM
子句 as documented in the manual page 中使用它们。
在你的情况下,那将是:
Result<TestFuncRecord> result =
DSL.using(configuration)
.selectFrom(Routines.testFunc("xx", 10))
.fetch();
或者也从 jOOQ 3.6 开始
Result<TestFuncRecord> result =
DSL.using(configuration)
.selectFrom(Tables.TEST_FUNC("xx", 10))
.fetch();
jOOQ 代码生成器将 table 值函数视为普通 tables,而不是例程。这就是为什么 Routines
中不应有采用 Configuration
参数的方法。