JOOQ PostgreSQL连接导致InvalidResultException

问题描述 投票:1回答:2

我正在尝试在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()返回响应而不是抛出异常?

java postgresql jooq
2个回答
1
投票

这是一个众所周知的问题:https://github.com/jOOQ/jOOQ/issues/2808

不幸的是,jOOQ对象模型从JOIN .. USING语法生成重复列,就像您使用JOIN .. ON语法一样。解决方法是在SELECT子句中明确列出列,这在你的情况下可能是一个好主意,因为你可能在任何其他列名之间也有意外匹配(例如last_update),或者你可以别名您的表格及其列使用​​Table.as(String, Function),自动生成[table_name]__[column_name]方案。


1
投票

您选择了两个名为common_id的列。尝试别名其中一个。例如 :

 "public"."bar"."common_id" as bar_common_id
© www.soinside.com 2019 - 2024. All rights reserved.