我有一个 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 外键关系,但这是我不希望出现的复杂情况,因为它会(以及其他问题)需要每次向我的数据查询添加连接操作。
即使您没有获取所有列,您也可以使用您的
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);