Получение исключения нулевого указателя при отображении записи jooq в объект - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть несколько репозиториев JOOQ, которые извлекают данные из БД Postgres и предоставляют данные в виде объектов-значений.Я использовал JOOQ 3.10.7 и все работает нормально.Я обновил версию с весенней загрузкой до 2.1.4 с 2.0.3, которая обновила версию JOOQ до 3.11.10.Я начал получать исключение NullPointerException при отображении записи Jooq.

    try {
       record = jooq.build()
            .select(user.name)
            .where(user.id.eq(1))
            .fetchSingle();
    } catch (NoDataFoundException e) {
      return null;
    }
    return record.into(String.class);

В приведенном выше сценарии fetchSingle должен генерировать исключение NoDataFoundException, когда нет записи, соответствующей данному критерию (user.id.eq (1)).Но, по моим наблюдениям, это не вызывает исключение, а возвращает объект записи, который имеет поля как (user.name) и значение как «null».Это что-то ожидается?Я пытался использовать fetchOne().into(String.class), но та же проблема сохраняется.

Вот мой класс конфигурации JOOQ.

public class JooQJdbcImpl implements Jooq {

private final Settings defaultSettings = new Settings()
    .withRenderNameStyle(RenderNameStyle.AS_IS);

private final RecordMapperProvider recordMapperProvider = new DefaultRecordMapperProvider();

@Autowired
DataSource dataSource;

@Override
public DSLContext build() {
    return withSettings(defaultSettings);
}

@Override
public DSLContext withSettings(Settings settings) {
    final Configuration configuration = new DefaultConfiguration()
        .set(SQLDialect.POSTGRES_9_5)
        .set(dataSource)
        .set(recordMapperProvider)
        .set(settings);
    return DSL.using(configuration);
}

}

1 Ответ

1 голос
/ 30 апреля 2019

В общем, вы можете использовать fetchOneInto(String.class), что предотвращает NPE, когда запись не найдена.

Но, по моим наблюдениям, это не вызывает исключение, а возвращает объект записи, который имеет поля как (user.name) и значение как "null". Это что-то ожидается?

Да, это ожидаемо. Когда вы вызываете into(String.class), он попытается найти наиболее подходящий конструктор String и вызвать его со строковым аргументом, в этом случае вы фактически вызываете new String(null), что невозможно.

Однако вам не нужно полагаться на это поведение. Просто позвоните:

return jooq.build()
        .select(user.name)
        .where(user.id.eq(1))
        .fetchOne(user.name);
...