jOOQ возвращает неверное значение столбца из записи

#kotlin #jooq

#kotlin #jooq

Вопрос:

У меня есть следующая запись, полученная в результате запроса с несколькими объединениями:

переменная записи

Теперь, когда я пытаюсь получить конкретный столбец, которого нет в результате с:

 record[REG_MEDEWERKER.ID]
 

где REG_MEDEWERKER.ID генерируется код Kotlin, содержащий следующие сведения:

REG_MEDEWERKER.Поле идентификатора

Я ожидаю получить null . Однако вместо этого возвращается неверное значение идентификатора (of zkn_zaak.id ).

Чего мне здесь не хватает? Разве в jOOQ не должно быть достаточно информации (имя таблицы и поля) для извлечения правильного столбца из записи?

============ Обновление =============

Из кода кажется, что это предполагаемое поведение, и оно уже подробно обсуждается, например https://github.com/jOOQ/jOOQ/issues/4471 , https://github.com/jOOQ/jOOQ/issues/4455 , https://github.com/jOOQ/jOOQ/issues/4476 и https://github.com/jOOQ/jOOQ/issues/10266

Так что это многое объясняет.

Однако остается вопрос, как я могу определить, что этого столбца REG_MEDEWERKER.ID нет в результирующем наборе…

Ответ №1:

Реализован следующий метод расширения Kotlin, который возвращает значение записи, только если точное имя поля совпадает с точным именем поля в записи (см. Ответ Лукаса Эдера):

 fun <T> Record.getStrict(field: Field<T>): T? =
    this.field(field)?.qualifiedName
        ?.takeIf { field.qualifiedName == it }
        ?.let { this[field] }
 

Ответ №2:

Из Record.get(Field) Javadoc:

Если эта запись содержит поле с тем же Field.getName(), что и поле аргумента, это значение извлекается.

Таким образом, значение извлекается на основе неквалифицированного имени столбца. Только если это имя столбца неоднозначно, квалификация принимается во внимание, чтобы попытаться устранить неоднозначность имени столбца.

Хотя это может привести к неожиданному результату, который вы испытываете, он имеет много преимуществ при работе с таблицами с псевдонимами, производными таблицами и т. Д.

Комментарии:

1. Спасибо за реакцию. Есть ли другой способ проверить, есть ли столбец в результате? Что-то вроде Record.getStrict(Field) ?

2. @Jippe: Record.field(Field) создаст фактическое поле в записи. Затем вы можете проверить, совпадают ли полные имена.

3. Тем не менее, из всех SQLWarning записей в журнале я чувствую, что это не лучшая практика. Лучше ли использовать псевдонимы в выборе, чтобы устранить неоднозначность полей?

4. @Jippe: Я не могу сказать по вашему текущему вопросу, что вы не опубликовали запрос…

5. Вы можете найти запрос в этой сути