JOOQ SQL дал 1 параметр, но ожидал 0

Я пытаюсь выяснить, как использовать JOOQ с NamedParameterJdbcTemplate. Я успешно создал другие запросы, но я застрял при создании запроса, содержащего предложение WHERE. Когда я пытаюсь запустить метод ниже, я получаю сообщение об ошибке org.springframework.dao.InvalidDataAccessApiUsageException: SQL [выберите "first_name" из "customer", где "id" = cast(? Как целое число)]: дано 1 параметр, но ожидается 0

Я получаю ту же ошибку, когда пытаюсь использовать только целые числа в equals(), например... .where(fieldByName("id"). Equal(1001), та же ошибка и.where (fieldByName ("id"). Equal) (id), та же ошибка.

Если я удалю предложение WHERE, сам запрос, кажется, будет работать нормально.

Что я здесь не так делаю? Мне кажется, что синтаксис SQL правильный. Вероятно, я глупый, но я действительно не могу найти, что здесь не так. Пожалуйста помоги!

public String getCustomerFirstName(int id) {
    Query query = create.select(fieldByName("first_name"))
                    .from(tableByName("customer"))
                    .where(fieldByName("id").equal(param("id", id)));
    Param param = query.getParam("id");
    SqlParameterSource namedParameters = new MapSqlParameterSource(param.getName(), id);
    return this.getNamedParameterJdbcTemplate().queryForObject(query.getSQL(), namedParameters, String.class);
}

1 ответ

Решение

Чтобы jOOQ генерировал именованные параметры, вы должны явно указать это.

В вашем случае это сделало бы

String sql = create.renderNamedParams(query);

Вышеуказанное заменит ваш звонок

query.getSQL();

Обратите внимание, это задокументировано здесь:

http://www.jooq.org/doc/3.0/manual/sql-building/bind-values/named-parameters

Будущая версия jOOQ (вероятно, 3.1), вероятно, будет поддерживать инициализацию вашего DSLContext с настройкой всегда отображать именованные параметры как таковые. Это зарегистрировано как запрос функции на дорожной карте:

https://github.com/jOOQ/jOOQ/issues/2414

Другие вопросы по тегам