gpt4 book ai didi

postgresql - 在 jOOQ 中使用 unnest 作为字段而不是表

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

这是我试图在 PostgreSQL 中运行的查询:

SELECT * FROM message WHERE id IN (
SELECT unnest(message_ids) "mid"
FROM session_messages WHERE session_id = '?' ORDER BY "mid" ASC
);

但是,我无法做某事:

create.selectFrom(Tables.MESSAGE).where(Tables.MESSAGE.ID.in(
create.select(DSL.unnest(..))

因为 DSL.unnestTable<?> ,这是有道理的,因为它试图采用 List -like 对象(主要是文字)并将其转换为表格。

我觉得我需要找到一种方法将函数包装在我的字段名称周围,但我不知道如何继续。

注意。领域message_ids类型为 bigint[] .

编辑

所以,这就是我现在的做法,它完全按照预期工作,但我不确定这是否是最好的方法:

Field<Long> unnestMessageIdField = DSL.field(
"unnest(" + SESSION_MESSAGES.MESSAGE_IDS.getName() + ")",
Long.class)
.as("mid");

Field<Long> messageIdField = DSL.field("mid", Long.class);

MESSAGE.ID.in(
ctx.select(messageIdField).from(
ctx.select(unnestMessageIdField)
.from(Tables.CHAT_SESSION_MESSAGES)
.where(Tables.CHAT_SESSION_MESSAGES.SESSION_ID.eq(sessionId))
)
.where(condition)
)

编辑2

通过 https://github.com/jOOQ/jOOQ/blob/master/jOOQ/src/main/java/org/jooq/impl/DSL.java 上的代码后我想正确的做法是:

DSL.function("unnest", SQLDataTypes.BIGINT.getArrayType(), SESSION_MESSAGES.MESSAGE_IDS)

编辑3

因为一如既往地 lukas 在这里解决我的 jOOQ 问题,我将利用它 :)

尝试在某种签名中概括此函数

public <T> Field<T> unnest(Field<T[]> arrayField) {
return DSL.function("unnest", <??>, arrayField);
}

我不知道如何获取数据类型。似乎有办法得到DataType<T[]>来自 DataType<T>使用 DataType::getArrayDataType() ,但反过来是不可能的。我找到了这个类ArrayDataType , 但它似乎是包私有(private)的,所以我不能使用它(即使我可以,它也不会公开字段 elementType )。

最佳答案

旧的 PostgreSQL 版本有一个时髦的想法,即可以从 SELECT 子句中生成一个表,并将其扩展到“外部”表中,就好像它是在 中声明的一样>FROM 子句。这是一个非常晦涩的 PostgreSQL 遗留问题,这个例子是摆脱它并使用 LATERAL 的好机会。您的查询等同于此查询:

SELECT * 
FROM message
WHERE id IN (
SELECT "mid"
FROM session_messages
CROSS JOIN LATERAL unnest(message_ids) AS t("mid")
WHERE session_id = '?'
);

这可以更容易地转换为 jOOQ:

DSL.using(configuration)
.select()
.from(MESSAGE)
.where(MESSAGE.ID).in(
select(field(name("mid"), MESSAGE.ID.getDataType()))
.from(SESSION_MESSAGES)
.crossJoin(lateral(unnest(SESSION_MESSAGES.MESSAGE_IDS)).as("t", "mid"))
.where(SESSION_MESSAGES.SESSION_ID.eq("'?'"))
)

关于postgresql - 在 jOOQ 中使用 unnest 作为字段而不是表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36572388/

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