jOOQ: Как разрешить `неоднозначное совпадение для <column>` при объединении нескольких таблиц? - PullRequest
1 голос
/ 07 августа 2020

Следующий запрос 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 с именем «domain»
  • mail_mapping, mail_keyword и account все имеют PK с именем id

Я пробовал следующее, но не смог сказать 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, используя pgjdb c 42.2.14.

Вопрос : Как устранить предупреждение Fields Ambiguous match found?

Примечание: это не обман . Как разрешить неоднозначное совпадение при объединении сгенерированных классов Jooq , потому что это было связано с неоднозначностью подкласса - этот вопрос касается простого объединения объединений (в таблицах, которые имеют повторяющиеся столбцы PK).

1 Ответ

0 голосов
/ 07 августа 2020

Мне удалось убрать предупреждение go, переписав запрос в стиле 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 чище.

...