我正在使用 Jooq(不带 codegen)创建 SQL 查询并将它们发送到数据库。 我正在测试的表只有 2 列,一个 ID(字符串)和一个 JSONB 数据列。
有趣的是,如果我以这种格式生成查询:
select * from test_table where id = 'some_id'
我取回的地图中有一个 String 和一个 JSONB (我猜,正如预期的那样)。
但是,如果我将查询更改为:
select id, data from test_table where id = 'some_id'
由这样的代码生成:
select(field(ID_COLUMN), field(DATA_COLUMN))
.from(DSL.table("test_table"))
.where(field(ID_COLUMN).eq(id))
.fetch().intoMaps();
(对于第一个示例,它是相同的,但用
asterisk()
而不是两个字段)
我返回的地图有一个用于 ID 的字符串,但现在,数据列是一个包含 JSONB 数据的 PGobject。
我可以很好地处理这些类型中的任何一种,但我希望了解触发更改的原因以及我是否可以根据我的实现依赖它是一种类型或另一种类型。
您可能有充分的理由在没有代码生成器的情况下使用 jOOQ,这将有助于解决所有这些与数据类型相关的问题(主要的充分理由是仅在运行时已知的动态模式,其中代码生成不起作用),但是即使您不使用代码生成器,明确向 jOOQ 提示类型也是一个好主意,例如
field(DATA_COLUMN, SQLDataType.JSONB)
否则,jOOQ 将不知道 PostgreSQL 返回什么,并且无法为您做出决定。我不会依赖服务器或驱动程序的任何隐式行为。