【发布时间】:2016-08-03 00:19:47
【问题描述】:
这是我试图在 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.unnest 是Table<?>,这是有道理的,因为它试图采用List 类似的对象(主要是文字)并将其转换为表格。
我觉得我需要找到一种方法来将函数包装在我的字段名称周围,但我不知道如何继续。
注意。字段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)
)
EDIT2
查看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
由于 lukas 一如既往地为我的 jOOQ 困境而来,我将利用这一点 :)
试图概括这个函数,在 sort 的签名中
public <T> Field<T> unnest(Field<T[]> arrayField) {
return DSL.function("unnest", <??>, arrayField);
}
我不知道如何获取数据类型。似乎有一种方法可以使用DataType::getArrayDataType() 从DataType<T> 获取DataType<T[]>,但反过来是不可能的。我找到了ArrayDataType 这个类,但它似乎是包私有的,所以我不能使用它(即使我可以,它也不会暴露字段elementType)。
【问题讨论】:
-
你使用的是哪个 PostgreSQL 版本?
-
目前使用的是 9.4(另外,请您看看 EDIT3,好吗?)
标签: postgresql jooq