jOOQ:如何在跨多个表连接时解决“为 <column> 找到的模糊匹配”?
jOOQ: How to resolve `Ambiguous match found for <column>` when joining across multiple tables?
以下 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
,数据库为postgres,使用pgjdbc 42.2.14
.
问题:
如何解决 Fields Ambiguous match found
警告?
注意:这不是 的骗局,因为那是关于子类歧义的问题 - 这个问题是关于连接的简单链接(跨具有重复 PK 列的表)。
我能够通过 re-writing 对 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 更干净。
以下 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
使用名为“域”的自然 PKmail_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
,数据库为postgres,使用pgjdbc 42.2.14
.
问题:
如何解决 Fields Ambiguous match found
警告?
注意:这不是
我能够通过 re-writing 对 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 更干净。