下面的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没有主keymail_domain使用自然的PK名为"domain"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列的表)。
发布于 2020-08-07 01:34:40
通过将查询重写为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也更干净。
https://stackoverflow.com/questions/63293919
复制相似问题