gpt4 book ai didi

java - 如何在 JOOQ 中设置一个@Variable

转载 作者:行者123 更新时间:2023-12-05 05:17:03 25 4
gpt4 key购买 nike

如何使用 JOOQ 使用@variables?(或者是否有更简单的方法来显示行号?-请注意,我需要将所选数据插入到另一个表中,并且 row_number 应始终从 0 开始!)

SET @row_number = 0;

SELECT
(@row_number:=@row_number + 1) AS NUM, FIRST_NAME, LAST_NAME
FROM
AUTHOR
LIMIT 5;

这就是我认为 JOOQ 代码的样子...

Field<Integer> num = DSL.field("@row_number:=@row_number +1", Integer.class);
DSLContext create = DSL.using(connection, dialect);
create.select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, num)
.from(AUTHOR)
.limit(5)
.fetch();

我需要执行那个吗

SET @row_number = 0;

使用普通 JDBC ?

我在 StackOverflow 上找到了关于变量和 JOOQ 的东西 - how can we have variable in jooq

编辑:我进行了更多调查,了解到此“解决方案”的结果可能会在未来版本中发生变化。 ao 我考虑将其更改为创建一个具有 pk 标识(从 0 开始)的临时表,然后我得到相同的结果,但没有用户变量集和更新。

最佳答案

正如您所注意到的,jOOQ 目前并不严格支持您的语法,因此您必须使用 jOOQ API 提供的纯 SQL 模板机制: https://www.jooq.org/doc/latest/manual/sql-building/plain-sql-templating

您已经为查询本身正确完成了该操作。现在关于初始化变量,最好在同一个 JDBC 语句中完成,而不是在单独的语句中完成,以防止 jOOQ 在连续执行之间关闭 JDBC 连接(例如,使用 DataSourceConnectionProvider 时)引起的副作用。因此,使用 jOOQ 最直接的方法是使用 ExecuteListener。仅将初始化 SQL 字符串添加到该特定语句,例如

class InitialisingVariableListener extends DefaultExecuteListener {
@Override
public void renderEnd(ExecuteContext ctx) {
ctx.sql("SET @row_number = 0;" + ctx.sql());
}
}

并在执行查询之前将其挂接到您的配置:

Field<Integer> num = DSL.field("@row_number:=@row_number +1", Integer.class);
DSLContext create = DSL.using(connection, dialect);
create.configuration().set(new InitialisingVariableListener());
create.select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, num)
.from(AUTHOR)
.limit(5)
.fetch();

如果您在多个查询中重用 Configuration,您可能更愿意对其调用 derive() 以创建新的 Configuration 而不是 set(),它为每个人修改 Configuration

关于java - 如何在 JOOQ 中设置一个@Variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49590493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com