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

2024-03-17

这是我尝试在 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).


旧的 PostgreSQL 版本有一个时髦的想法,即可以从 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("'?'"))
   )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 jOOQ 中使用 unnest 作为字段而不是表 的相关文章

  • Postgres JSON 数据类型 Rails 查询

    我正在使用 Postgres 的 json 数据类型 但想要使用嵌套在 json 中的数据进行查询 排序 我想在 json 数据类型上使用 where 进行订购或查询 例如 我想查询关注者数量 gt 500 的用户 或者我想按关注者或关注数
  • postgresql 登录到另一个表时发生冲突

    我正在使用 PostgreSQL 9 5 并尝试使用批量插入每天插入数百万行 INSERT INTO tours as cst adults country id price VALUES 3 129 80 2 119 120 on con
  • postgresql:插入...(选择*...)

    我不确定它是否是标准 SQL INSERT INTO tblA SELECT id time FROM tblB WHERE time gt 1000 我正在寻找的是 如果 tblA 和 tblB 位于不同的数据库服务器中怎么办 Postg
  • PostgreSQL - 致命:用户“myuser”身份验证失败[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我刚刚在我的 Ubuntu Box 中安装了 PostGreSQL 我想做的第一件事就是创建一个数据库 我读了文档 http www postgres
  • TimescaleDB 查询选择列值较上一行发生更改的行

    最近刚刚开始使用 TimescaleDB 和 Postgres 来处理大多数数据请求 然而 我遇到了一个问题 即我对时间序列数据的请求效率极低 它是一个可以是任意时间长度 具有特定整数值的数据系列 大多数时候 除非出现异常 否则该值将是相同
  • postgresql 不同的不工作

    我使用以下代码从数据库获取值 但是当我编写这段代码时 测试看看问题出在哪里 我注意到查询没有从数据库中获取不同的值 这是查询 select distinct ca id as id acc name as accName pIsu name
  • 如何在 PostgreSQL 中返回不同时区的当前日期

    我正在开发一个使用东部时间并将数据库设置为太平洋时间的应用程序 这已经引起了一些问题 但我们被告知不可能有其他方式 所以我们只能解决它 不管怎样 我遇到的麻烦之一就是获取今天的约会 由于数据库位于太平洋 如果我使用以下命令询问今天的日期cu
  • 将 SQL Server 2008 DB 迁移到 Postgres [重复]

    这个问题在这里已经有答案了 我想将 SQL Server 2008 数据库迁移到 Postgres 有没有一种无痛的方法来做到这一点 是否有任何工具可以扫描架构和存储过程以标记兼容性问题 无痛http dbconvert com conve
  • 如何确定层级组织中的权限?

    我正在尝试创建高性能逻辑来确定分层组织内的权限 员工被分配到一个或多个单位 单元是分层的 理论上 无限深度 实际上不超过 6 层 例如 员工Jane可能是Supervisor of the Accounts Receivable单元 的子单
  • JPA 支持查询 Postgres JSON 字段

    JPA 是否已经支持处理 JSON 字段的查询 如下所示 select from person where info gt gt age numeric 40 select from person where info gt gt firs
  • 在 plpgsql 函数中使用 quote_ident()

    我是创建 plpgsql 函数的新手 我需要一些有关在函数内部执行的动态命令上使用 quote ident 甚至 quote literal 的说明 希望有人能给我一个关于它们如何在函数内部工作的具体解释 TIA 这是一个例子 EXECUT
  • Rails 的多个数据库不适用于远程数据库

    我有一个远程只读 postgres 数据库 它是通过 docker 实例维护的卡尔达诺数据库同步 https github com input output hk cardano db sync 我设法将开发数据库连接到它 它工作正常 但由
  • 如何对 JSON 类型列进行分组/选择(PG::UndefinedFunction: 错误: 无法识别 json 类型的等式运算符)

    我想做
  • 使用所有连接的 Flask unittest 和 sqlalchemy

    在进行了大约 100 个单元测试后 我刚刚在 Flask 应用程序上运行单元测试时遇到了问题 所有单元测试都会通过 但是当一次全部运行时 它们将失败并出现以下错误 OperationalError OperationalError FATA
  • 授予用户 ALTER 函数的权限

    我试着ALTER一个新用户的函数 我收到错误 ERROR must be owner of function ACases Error ERROR must be owner of function ACases SQL state 425
  • 如何编写不返回任何内容的 postgres 存储过程?

    如何在 postgres 中编写一个根本不返回值的简单存储过程 即使使用 void 返回类型 当我调用存储过程时 我也会返回一行 CREATE FUNCTION somefunc in id bigint RETURNS void AS B
  • 如何插入UUID的值?

    我在 Play Framework 2 3 支持的 postgresql 9 4 中使用 anorm 2 4 给出一个这样的模型 case class EmailQueue id UUID send from String send to
  • sql直接获取表行数的方法

    stackoverflow 的朋友们大家好 我的例行程序中有一个我认为不必要的步骤 假设您想从图库中获取所有图像 并限制每页一定数量的图像 db PDO object start pagenum x images per page limi
  • Postgres 多重连接

    这是一个 postgres 数据库 我试图从品种表中提取狗的品种名称 卡斯罗 拉布拉多等 以根据动物表中的外键进行显示 我的问题是动物表有两个外键指向这个单一品种表 并且我的查询不断出错 第一个品种名称将根据左连接返回 但第二个品种名称无法
  • 使用包含 [模板]、[编码]、[所有者] 的批处理文件和 .sql 文件创建 Postgres 数据库

    我想使用批处理文件创建 Postgres 数据库 现在执行此操作的正常方法如下 C Program Files PostgreSQL 9 0 bin createdb exe U Myadmin MydatAbseName 上面的脚本使用默

随机推荐

  • 从存在缺失值的现有列创建新列

    我正在尝试根据这两列创建一个新列 假设我想创建一个新列 z 当 y 不丢失时 它应该是 y 的值 当 y 确实丢失时 它应该是 x 的值 所以在这种情况下 我期望 z 是 1 8 10 8 x y 0 1 NaN 1 2 8 2 4 10
  • Sympy:化简平方根

    Sympy 似乎无法简化涉及变量平方的平方根的表达式 In 28 a x 2 In 29 b a 1 2 In 30 b Out 30 0 5 2 x In 31 b simplify Out 31 0 5 2 x 我无法将此与其他变体一起
  • 使用 PHP 7.2.4 的 Ubuntu 16.04 上缺少 PDO 驱动程序

    我想在Kubuntu 16 04上尝试最新版本的PHP 从那时起 我似乎无法将pdo与mysql一起使用 当我启动 php 时 出现以下警告 PHP Warning PHP Startup Unable to load dynamic li
  • 从 s3 读取文件时 joblib.load 出错

    当尝试从 s3 读取文件时joblib load 我收到错误ValueError embedded null byte当尝试读取文件时 这些文件是由 joblib 创建的 并且可以从本地副本 在上传到 s3 之前在本地制作 成功加载 因此错
  • 在 Backbone 中进行视图混合的正确方法

    我一直扩展基本主干视图 并且每个部分都有一个基本视图 以便我可以在多个级别上扩展 我的问题是 执行视图混合的最有效方法是什么 可以混合到任何视图中的可重用视图部分 例如 var BaseProfile Backbone View exten
  • Yahoo Pipes:根据文本文件中的单词过滤提要中的项目

    我有一个管道 可以过滤 RSS 提要并删除任何包含我选择的 停用词 的项目 目前 我已经在管道编辑器中为每个停用词手动创建了一个过滤器 但更合乎逻辑的方法是从文件中读取它们 我已经弄清楚如何从文本文件中读取停用词 但是如何将过滤器运算符应用
  • ReCaptcha 在 iPhone 上无法正常工作

    我有一个带有简单联系表格的网站 验证有点少 因为它不进入数据库 只是一封电子邮件 该表格的工作原理如下 有 5 个字段 其中 4 个为必填字段 提交将被禁用 直到 4 个字段有效 然后您才能提交 然后 所有内容都会在服务器上再次验证 包括验
  • Hibernate 完全支持 SQLite 吗?

    Jboss Hibernate 中没有提及对 SQLite 的支持its wiki https community jboss org wiki SupportedDatabases2 Stack Overflow 帖子中也提到了同样的内容
  • ggplot2刻度填充梯度与离散上限

    我正在寻找价值热图 我希望热图从表示低值的蓝色 示例代码中的 0 变为表示高值的绿色 示例代码中的 75 但是 数据包含大于 75 的值 我希望任何大于 75 的值都用红色填充 总而言之 我希望填充从 0 到 75 蓝色 到绿色 绿色 任何
  • 如何将es6语法添加到atom编辑器

    我曾经使用 sublime text 但现在想使用atom io 编辑器 我有这些代码行 error Missing semicolon import React Component from react export default cl
  • 根据 Java 编码标准进行异常处理

    我有一个关于异常处理情况下的java标准的查询 代码片段 public String methodXXX This method may throw IllegalArgumentexception and arrayoutofbounda
  • 用 C++ 解释 2D 线段/四叉树 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 附 这可能不是重复的 我进行了搜索 并确保我没有得到我想要的东西 我是一名 ACM 问题解决者 最近我学习了线性数组的线段树和具有延迟传播的
  • 如何使用 CMake 和 Visual Studio 设置路径环境变量来运行测试

    我正在使用 CMake 生成 Visual Studio 项目文件 我想在设置 PATH 环境变量后运行测试可执行文件 以便它能够加载所需的 dll 我尝试按照讨论http www mail archive com 电子邮件受保护 msg2
  • 如何才能有一个永久状态行显示当前文件的名称?

    我总是忘记我正在编辑哪个文件 In Vim 7 x how can I have a permanent status bar at the bottom like what is displayed when I press Ctrl G
  • 托管爬虫的最佳解决方案? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个爬虫 可以爬行几个不同的域以获取新帖子 内容 内容总量数十万页 并且每天都有大量新内容添加 因此
  • 如何在猫头鹰轮播项目之间添加空格

    如何在猫头鹰项目之间添加空间 在项目之间添加边距或填充 这需要响应式 我可以在 jquery 中添加一些装订线吗 function newsCarousel carousel owlCarousel items 4 itemsCustom
  • 如何判断读取dir是否完成

    每个人 我正在使用 node webkit 开发某种图像视图应用程序 我创建了一个函数来读取给定位置内的目录并搜索图像文件 jpg 和 png 我使用的代码如下 app js var fs require fs var gui requir
  • 如何使用sequelize-cli设置mysql日期类型长度

    续集 CLI版本 sequelize cli 6 2 0 sequelize 6 3 3 我用它来生成 mysql 用户表 npx sequelize cli model generate name User attributes firs
  • GLMER:错误:(maxstephalfit)PIRLS 减半未能减少 pwrssUpdate 中的偏差

    我正在研究各种特征对法院对特定犯罪的判决的影响 该数据集非常大 28928 个观测值 86 个 2 级单元 我正在考虑是否使用 level1 和 level2 特征作为控制 level1 为大写字母 来决定是否监禁某人 二元结果变量 这是我
  • 在 jOOQ 中使用 unnest 作为字段而不是表

    这是我尝试在 PostgreSQL 中运行的查询 SELECT FROM message WHERE id IN SELECT unnest message ids mid FROM session messages WHERE sessi