【问题标题】:Query from user defined function JOOQ从用户定义函数 JOOQ 查询
【发布时间】:2017-01-09 12:28:24
【问题描述】:

我希望从用户定义的函数中进行查询。我见过的所有例子都是以select参数查询函数

myFunction.setMyParam("plapla");
create.select(myFunction.asField()).fetch();

这会将结果作为一列返回,尽管结果实际上是多列。

我想做的是

myFunction.setMyParam("plapla");
create.select().from(myFunction).fetch();

但是我还没有找到方法……

目前我正在使用

DSL.using(create.configuration())
                .select()
                .from("myFunction('" + myparam + "')")
                .fetch();

这似乎不是一个好的解决方案(未转义、未处理等)

如何使用 JOOQ 生成函数?

【问题讨论】:

  • 表值函数高度依赖于 jOOQ 中的 SQL 方言。你用的是什么数据库?另外,您能否在您的数据库中声明MY_FUNCTION 时显示它的签名?
  • 使用 postgres 和 MY_FUNCTION(text, integer, text)
  • 可能与这个问题有关stackoverflow.com/questions/28383480/…我的函数返回表RETURNS TABLE(myParams text) AS $BODY$myFunction.execute(configuration()); myFunction.getMyParameter();只返回第一行..使用JOOQ 3.8.3
  • 你知道你可以编辑你的问题:)
  • 我认为如果我编辑你不会收到通知?

标签: java sql postgresql jooq


【解决方案1】:

jOOQ 为 PostgreSQL 表值函数生成函数调用。如果您的函数如下所示:

CREATE FUNCTION my_function(text, integer, text)
RETURNS TABLE (myParams text) AS ...

然后jOOQ产生如下方法:

public class Tables {
    ...
    public static MyFunction myFunction(String param1, Integer param2, String param3) 
    { ... }
}

然后您可以这样调用:

Result<MyFunctionRecord> result =
DSL.using(create.configuration())
   .selectFrom(myFunction("a", 1, "b")
   .fetch();

生成的记录将采用以下形式:

public class MyFunctionRecord {
    ...
    public String getMyParams() { ... }
}

【讨论】:

  • 我的功能和你说的一样,但不是在Tables下发布的,是在routines下的
  • 我明白了,代码生成器配置中有一个标志,它也在表格下。不过没关系。
  • 设置&lt;tableValuedFunctions&gt;true&lt;/tableValuedFunctions&gt;工作
【解决方案2】:

由于臭名昭著,我现在不得不关闭生成表值函数

java: 变量 XYZ 已在类中定义

我能够像上面那样完成上述工作

create
    .selectFrom( Routines.myFunction(myparam).toString() )

我希望能够正确生成表值函数,因为上面的答案更好,但这同时也可以。

【讨论】:

    猜你喜欢
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多