是否可以定义一个绑定/转换器/什么来在代码生成时自动将列转换为SELECT中的特定格式/数据类型?

例如, 假设我们有数据类型为tstzrange postgres的列valid_date_range.

并且我们希望以以下形式 Select 它:

select json_build_array(lower(valid_date_range), upper(valid_date_range)) as date_range from whatever

有没有可能定义一个在代码生成时自动执行此操作的转换器/绑定?就我所知,实现Binding类型只会对bind个值执行此操作,而不会对select个语句字段执行此操作?

(我知道这可以通过创建一个字段来手动完成,但我希望在每个SELECT查询中始终转换这tstzrange个字段.)

推荐答案

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 -&gt; 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种类型.

Postgresql相关问答推荐

无法在PostgreSQL中创建方案和表

是否从表中 Select 值?巴什

PostgreSQL临时文件的误解

Postgres内部如何计算月份间隔

使用 postgresql Select 整数作为位和状态表

PostgreSQL:如何避免被零除?

Heroku Rails 4 无法连接到服务器:connection refused

postgreSQL 中对 utf-8 的 LC_COLLATE 和 LC_CTYPE 支持

如何使用 ActiveRecord json 字段类型

更详细地解释 JOIN 与 LEFT JOIN 和 WHERE 条件性能建议

'active' 标志与否?

H2 postgresql mode模式似乎不起作用

在 postgreSQL 中更改序列名称

如何为 postgres 连接设置 application_name?

Postgres Npgsql 连接池

FOR EACH STATEMENT 触发器示例

如何将 Heroku PG 转储导入本地机器

postgres regexp_replace 只想允许 a-z 和 A-Z

PostgreSQL:如果不存在则创建表 AS

在 pg_restore 期间排除表