我正在尝试在JOOQ中加入两个表并输出结果作为Map<String, Object>
,但我得到InvalidResultException("Field common_id is not unique in Record")
。
我正在执行的代码如下:
dslContext.select()
.from(FOO)
.join(BAR).using(FOO.COMMON_ID)
.where(FOO.FOO_VALUE.eq(123))
.limit(1)
.fetchOne()
.intoMap();
生成的SQL是这样的:
SELECT "public"."foo"."foo_id",
"public"."foo"."common_id",
"public"."foo"."foo_value",
"public"."bar"."bar_id",
"public"."bar"."common_id",
"public"."bar"."bar_value",
"public"."bar"."bar_value_two"
FROM "public"."foo"
JOIN "public"."bar"
WHERE "public"."foo"."common_id" = ?
LIMIT ?;
我期望JOOQ理解我正在加入的值将出现在两个表中,并在结果Record
中省略其中一个,但它似乎没有这样做。
我只是错过了一些明显的东西吗?从生成的common_id
中过滤掉重复的Record
的最佳/正确方法是什么,以便调用intoMap()
返回响应而不是抛出异常?
这是一个众所周知的问题:https://github.com/jOOQ/jOOQ/issues/2808
不幸的是,jOOQ对象模型从JOIN .. USING
语法生成重复列,就像您使用JOIN .. ON
语法一样。解决方法是在SELECT
子句中明确列出列,这在你的情况下可能是一个好主意,因为你可能在任何其他列名之间也有意外匹配(例如last_update
),或者你可以别名您的表格及其列使用Table.as(String, Function)
,自动生成[table_name]__[column_name]
方案。
您选择了两个名为common_id
的列。尝试别名其中一个。例如 :
"public"."bar"."common_id" as bar_common_id