【问题标题】:How to resolve ambiguous match when chaining generated Jooq classes链接生成的 Jooq 类时如何解决模棱两可的匹配
【发布时间】:2019-09-16 11:05:21
【问题描述】:

我已经在 J​​PA 中定义了我的模型,并正在为我的应用程序编写一些查询,我正在使用 JOOQ 生成的类将所有表连接在一起,以检查请求的资源是否确实属于请求用户。

但是,当我这样做时,我会收到以下警告:

Ambiguous match found for ID. Both "alias_4548634"."ID" and "alias_47496750"."ID" match.

java.sql.SQLWarning: null                                                                                                                                       
        at org.jooq.impl.Fields.field(Fields.java:132) ~[jooq-3.11.10.jar:?]
... etc

这是我的代码

db.select(countField)
  .from(thing)
  .where(JThing.THING.thingBucket().bucket().organization().customer().ID.in(idList))
  .orderBy(countField)

这是它生成的 SQL

SELECT 
  count(PUBLIC.THING.ID) AS count
FROM (
  PUBLIC.THING
    LEFT OUTER JOIN (
      PUBLIC.THING_BUCKET AS alias_72652126
        LEFT OUTER JOIN (
          PUBLIC.BUCKET AS alias_4548634
            LEFT OUTER JOIN (
              PUBLIC.ORGANISATION AS alias_43016761
                LEFT OUTER JOIN PUBLIC.CUSTOMER AS alias_47496750
                ON alias_43016761.CUSTOMER_ID = alias_47496750.ID
            )
            ON alias_4548634.ORGANISATION_ID = alias_43016761.ID
        )
        ON alias_72652126.ID = alias_4548634.ID
    )
    ON PUBLIC.THING.THING_BUCKET_ID = alias_72652126.ID
  )
WHERE alias_47496750.ID IN (81353)
ORDER BY count

鉴于 JOOQ 正在生成 SQL,我希望它能够理解它而不会引发错误。我错过了什么?我该如何配置/查询/什么来解决 SQLWarning?

更新

在玩了之后,我已经确定了问题的根源。

THING_BUCKET 是 BUCKET 的子类型,因此 THING_BUCKET.ID = BUCKET.ID

如果我将查询重写为我得到相同的结果,但没有错误

SELECT 
  count(PUBLIC.THING.ID) AS count
FROM (
  PUBLIC.THING
        LEFT OUTER JOIN (
          PUBLIC.BUCKET AS alias_4548634
            LEFT OUTER JOIN (
              PUBLIC.ORGANISATION AS alias_43016761
                LEFT OUTER JOIN PUBLIC.CUSTOMER AS alias_47496750
                ON alias_43016761.CUSTOMER_ID = alias_47496750.ID
            )
            ON alias_4548634.ORGANISATION_ID = alias_43016761.ID
        )
    ON PUBLIC.THING.BUCKET_ID = alias_4548634.ID
  )
WHERE alias_47496750.ID IN (81353)
ORDER BY count

所以我想做的就是去

db.select(countField)
  .from(thing)
  .where(JThing.THING.bucket().organization().customer().ID.in(idList))
  .orderBy(countField)

并将我的 THING 直接加入 BUCKET 而不是 THING_BUCKET,但我不知道如何使用生成的类来完成此操作。

【问题讨论】:

  • 这真的是 jOOQ 生成的完整 SQL 语句,还是您遗漏了一些东西来简化这里的示例?什么是完整的堆栈跟踪?产生堆栈跟踪的实际客户端代码是什么?

标签: java sql postgresql jooq


【解决方案1】:

根据您的描述,看起来像 BUCKET 和 THINK_BUCKET 被描述为 db 级别的子类型,被 jooq 生成的类弄糊涂了。

短期修复可能是,在 db 级别切断层次关系,重新生成并看看会发生什么。

【讨论】:

    【解决方案2】:

    这看起来像是 jOOQ 3.14 中已修复的错误,请参阅#8659#10603

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 2012-12-08
      相关资源
      最近更新 更多