JOOQ虚拟客户端计算列
您可以使用virtual client side computed columns来完成此操作.您可以在代码生成器配置中对其进行如下配置:
<configuration>
<generator>
<database>
<syntheticObjects>
<columns>
<column>
<tables>WHATEVER</tables>
<name>DATE_RANGE</name>
<type>JSON</type>
</column>
</columns>
</syntheticObjects>
<forcedTypes>
<forcedType>
<generator>ctx -> org.jooq.impl.DSL.jsonArray(
DSL.field("lower({0})", VALID_DATE_RANGE),
DSL.field("upper({0})", VALID_DATE_RANGE)
)</generator>
<includeExpression>(?i:WHATEVER.DATE_RANGE)</includeExpression>
</forcedType>
</forcedTypes>
</database>
</generator>
</configuration>
它声明了一个synthetic column和获取合成列时要使用的生成器逻辑.
PostgreSQL计算列
上述客户端计算列的工作方式与"服务器端"计算列类似,即直接在PostgreSQL中计算的列,当然,您也可以使用它:
ALTER TABLE whatever
ADD date_range json
GENERATED ALWAYS AS (
json_build_array(lower(valid_date_range), upper(valid_date_range))
) STORED;
尽管PostgreSQL还不支持这些列的VIRTUAL
选项,但它们始终是STORED
.JOOQ在客户端同时支持:
使用客户端函数函数
您还可以将逻辑提取到函数中,如下所示:
public static Field<JSON> dateRange(Whatever table) {
return jsonArray(
field("lower({0})", table.VALID_DATE_RANGE),
field("upper({0})", table.VALID_DATE_RANGE)
);
}
现在在您的查询中使用它:
ctx.select(WHATEVER.ID, dateRange(WHATEVER))
.from(WHATEVER)
.fetch();
您还可以将此函数作为存储函数存储在PostgreSQL中.
视图
当然,对于以下这些事情,视图总是一个(被忽视的!)选项:
CREATE VIEW whatever_plus
AS
SELECT
whatever.*,
json_build_array(lower(valid_date_range), upper(valid_date_range)) AS date_range
FROM whatever
JOOQ的代码生成器将像任何其他表一样获取该视图,然后您可以对其进行查询.如果您不连接它,它甚至可能是可更新的,所以如果您在它上面声明了synthetic constraints,您也许能够将该视图连接到基表,或者在它上面使用UpdatableRecord
种类型.