【问题标题】:Getting results from table-valued Postgresql function with JOOQ使用 JOOQ 从表值 Postgresql 函数中获取结果
【发布时间】:2015-02-09 16:18:29
【问题描述】:

我有一个返回表的 Postgresql 函数

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 中的查询返回正确的结果

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);
}
...

在例程类中

...
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

所以,它正确地返回了第一行的值,但是我怎样才能得到整个表呢?

(jooq 3.5.0)

【问题讨论】:

  • 没有。我正在尝试使用 JOOQ 重新生成的例程提出请求。现在生成的与我得到的相同,当函数只返回一个记录时。我无法得到这里描述的结果jooq.org/doc/3.5/manual/sql-building/table-expressions/…
  • @user693442:你能展示一下你正在使用的 jOOQ 代码吗?您能否也显示函数体,以确保其中没有任何问题?
  • 更新问题
  • 感谢您的更新。有趣的是,我没有得到那个特定的testFunc(Configuration, String, Integer) 方法(see my answer)。可能有一个微妙的错误。你介意把它交给jOOQ User Group吗?更容易讨论进一步的步骤以查看可能导致错误的原因(可能是 PostgreSQL 版本?)

标签: postgresql jooq


【解决方案1】:

从 jOOQ 调用表值函数的正确方法是在您已链接的 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 代码生成器将表值函数视为普通表,而不是例程。这就是为什么在 Routines 中不应该有采用 Configuration 参数的方法。

【讨论】:

  • @user693442 感谢您的接受。你遇到的实际问题是什么? IE。你发现是什么产生了“错误”的生成例程吗?
  • 我的类路径中有几个不同版本的 jooq jar。第二个问题是重载的表值过程。我为此 stackoverflow.com/questions/28434559/… 发布了一个单独的问题
  • @user693442:嗯,是的,这肯定会导致问题...感谢您的反馈
猜你喜欢
  • 2021-10-24
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 2017-02-04
  • 2016-04-13
  • 2015-09-09
  • 1970-01-01
相关资源
最近更新 更多