Как устранить неоднозначное совпадение при создании цепочек сгенерированных классов Jooq - PullRequest
1 голос
/ 27 апреля 2019

Я определил свои модели в JPA и пишу несколько запросов для своего приложения, и я использую сгенерированные 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, но я не знаю, как этого добиться с помощью сгенерированных классов.

1 Ответ

0 голосов
/ 01 мая 2019

Из вашего описания похоже, что BUCKET и THINK_BUCKET, описываемые как подтипы на уровне db, запутываются сгенерированными классами jooq.

Краткосрочное исправление может заключаться в том, чтобы разрезать иерархические отношения на уровне БД, восстановить и посмотреть, что произойдет.

...