【问题标题】:jOOQ: How to resolve `Ambiguous match found for <column>` when joining across multiple tables?jOOQ:跨多个表连接时如何解决“为 <column> 找到的模糊匹配”?
【发布时间】:2020-11-27 07:49:55
【问题描述】:

以下 jOOQ 查询在我的日志中发出一条 SQL 警告:Fields Ambiguous match found for id

db.select(FORWARDED_MESSAGE.SES_MESSAGE_ID).
  from(FORWARDED_MESSAGE).
  where(
    FORWARDED_MESSAGE.FORWARDED.lt( DSL.currentTimestamp().subtract(
      FORWARDED_MESSAGE.mailMapping().mailKeyword().mailDomain().account().
        MESSAGE_RETENTION_DAYS ))).
  fetch(FORWARDED_MESSAGE.SES_MESSAGE_ID);

生成的 SQL 似乎是正确的,但我不希望警告污染我的日志(我想知道 jOOQ 是否警告我需要注意的重要事项)。

关于模式表的一些上下文:

  • forwarded_message 没有主键
  • mail_domain 使用名为“域”的自然 PK
  • mail_mapping、mail_keyword 和 account 都有一个名为 id 的 PK

我尝试了以下方法,但无法说出Key ambiguous between tables:

db.select(FORWARDED_MESSAGE.SES_MESSAGE_ID).
  from(FORWARDED_MESSAGE).
    join(MAIL_MAPPING).onKey().
    join(MAIL_KEYWORD).onKey().
    join(MAIL_DOMAIN).onKey().
    join(ACCOUNT).onKey().
  where(
    FORWARDED_MESSAGE.FORWARDED.lt(
      DSL.currentTimestamp().subtract(ACCOUNT.MESSAGE_RETENTION_DAYS) )).
  fetch(FORWARDED_MESSAGE.SES_MESSAGE_ID);

jOOQ 版本是3.13.4,DB 是postgres,使用pgjdbc 42.2.14。

问题:
如何解决Fields Ambiguous match found 警告?

注意:这不是 How to resolve ambiguous match when chaining generated Jooq classes 的欺骗,因为那是关于子分类的歧义 - 这个问题是关于简单的连接链接(跨具有重复 PK 列的表)。

【问题讨论】:

  • 是否有带有警告的堆栈跟踪?所涉及的各种表的 DDL 是什么?

标签: jooq


【解决方案1】:

我可以通过将查询重写为join().onKey() 样式来消除警告,但要明确指定连接外键。

这有点冗长,但似乎有效:

db.select(FORWARDED_MESSAGE.SES_MESSAGE_ID).
  from(FORWARDED_MESSAGE).
    join(MAIL_MAPPING).
      onKey(Keys.FORWARDED_MESSAGE__FORWARDED_MESSAGE_MAIL_MAPPING_ID_FKEY).
    join(MAIL_KEYWORD).onKey(Keys.MAIL_MAPPING__MAIL_MAPPING_MAIL_KEYWORD_ID_FKEY).
    join(MAIL_DOMAIN).onKey(Keys.MAIL_KEYWORD__MAIL_KEYWORD_DOMAIN_FKEY).
    join(ACCOUNT).onKey(Keys.MAIL_DOMAIN__MAIL_DOMAIN_MAIL_DOMAIN_ACCOUNT_ID_FKEY).
  where(
    FORWARDED_MESSAGE.FORWARDED.lt(
      DSL.currentTimestamp().subtract(ACCOUNT.MESSAGE_RETENTION_DAYS) )).
  fetch(FORWARDED_MESSAGE.SES_MESSAGE_ID);

不知道为什么这与FORWARDED_MESSAGE.mailMapping()...account() 风格有很大不同。但它可以工作,并且生成的 SQL 更干净。

【讨论】:

    猜你喜欢
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 2021-12-24
    • 2020-01-14
    相关资源
    最近更新 更多