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
с настройкой всегда отображать именованные параметры как таковые. Это зарегистрировано как запрос функции на дорожной карте: