这是我尝试在 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(..))
Because DSL.unnest
is a Table<?>
,这是有道理的,因为它试图采取List
-like 对象(主要是文字)并将其转换为表。
我有一种感觉,我需要找到一种方法来将函数包装在我的字段名称周围,但我不知道如何继续。
笔记。场message_ids
属于类型bigint[]
.
EDIT
所以,这就是我现在正在做的事情,它的工作原理与预期完全一样,但我不确定这是否是最好的方法:
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)
)
EDIT2
浏览完代码后https://github.com/jOOQ/jOOQ/blob/master/jOOQ/src/main/java/org/jooq/impl/DSL.java 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)
EDIT3
由于卢卡斯一如既往地在这里解决我的 jOOQ 困境,我将利用这一点:)
尝试以某种签名形式概括此函数
public <T> Field<T> unnest(Field<T[]> arrayField) {
return DSL.function("unnest", <??>, arrayField);
}
我不知道如何获取数据类型。似乎有办法获得DataType<T[]>
from DataType<T>
using DataType::getArrayDataType()
,但反过来是不可能的。我找到了这个类ArrayDataType
,但它似乎是包私有的,所以我不能使用它(即使我可以,它也不会公开该字段elementType
).