如何使用 jOOQ 活动记录延迟获取一列

问题描述 投票:0回答:1

我有一个 PostgreSQL 表,它定义了几个小的简单列和一个存储大型二进制数据的列

data

create table my_table
(
    id          serial primary key,
    data        bytea  not null,
    description text
);

当我通过 jOOQ 获取该表的行(进入

MyTableRecord
)时,jOOQ 会立即获取每一列。我知道 jOOQ 支持通过
fetchLazy()
stream()
延迟获取记录,但这仅适用于行级别,不适用于单个列。

因此,生成的

MyTableRecord
类始终具有存储在内存中的
data
的简单 getter:

...
public byte[] getData() {
    return (byte[]) get(1);
}
...

这意味着每当我想要使用

MyTableRecord
的活动记录实例时,我都必须从数据库中获取所有数据,即使我不需要它。 如何更改 jOOQ/MyTableRecord 的行为以延迟获取
data
列,仅当我第一次在记录对象上调用
.getData()
时?

我知道这个问题可以通过一种解决方法来解决,即我将二进制数据卸载到另一个表并引入 1:1 外键关系,但这是我不希望出现的复杂情况,因为它会(以及其他问题)需要每次向我的数据查询添加连接操作。

java postgresql activerecord lazy-loading jooq
1个回答
0
投票

即使您没有获取所有列,您也可以使用您的

MyTableRecord
。只需确保包含主键即可:

Result<MyTableRecord> result =
ctx.select(MY_TABLE.ID, MY_TABLE.DESCRIPTION)
   .from(MY_TABLE)
   .fetchInto(MY_TABLE);

现在,当您准备好时,刷新相关记录:

myTableRecord.refresh(MY_TABLE.DATA);

您还可以预先获取这些值中的一些,而其他值则稍后获取,如下所示:

Result<MyTableRecord> result =
ctx.select(
      MY_TABLE.ID, 
      MY_TABLE.DESCRIPTION,
      when(MY_TABLE.ID.in(1, 2, 3), MY_TABLE.HEAVY_COL1).as(MY_TABLE.DATA))
   .from(MY_TABLE)
   .fetchInto(MY_TABLE);
© www.soinside.com 2019 - 2024. All rights reserved.