Как решить плохую ошибку грамматики sql с Spring JDBC?

1

Я использую PostgreSQL с Spring JDBC. Каждое здание с люлькой:

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("org.springframework:spring-jdbc")
    compile("postgresql:postgresql:9.0-801.jdbc4")
    compile("com.h2database:h2")
    compile("com.googlecode.json-simple:json-simple:1.1")
    testCompile("junit:junit")
}

Вот фрагмент кода, где я получил исключение:

String sql = "INSERT INTO " + dbname + " (:fields) VALUES (:values)";
MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue( "fields", fieldsObj.keySet().toArray() );
parameters.addValue( "values", fieldsObj.values().toArray() );
count = jdbcTemplate.update( sql, parameters );

Я получаю эту ошибку:

PreparedStatementCallback; плохая грамматика SQL [INSERT INTO test (?,?,?) VALUES (?,?,?)]; Вложенное исключение - org.postgresql.util.PSQLException

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

Теги:
spring
spring-jdbc

1 ответ

1
Лучший ответ

Вы не можете использовать метки значений ("?") Для вещей, которые не являются значениями (например, ваши имена полей).

Если вы действительно хотите это сделать, просто создайте запрос, сопоставив имена полей в. Затем примените значения с помощью заполнителей.

НО убедитесь, что вы проверяете имена полей так, как вы ожидали, и убегайте/цитируйте их правильно.

Ох - Не программист на Java, но проверьте, что keySet() и values () возвращают свои результаты в том же порядке.


Редактировать:

"?" Знаки являются знаменателями. Они используются в библиотеках всех подключений. Они будут сопоставлены с любым параметризованным синтаксисом запроса, который может использовать база данных. Однако они работают только для значений - поэтому база данных может анализировать запрос с помощью заполнителей.

  • 0
    Можете ли вы объяснить, что "?" означает? Я думал, что это спецификация Java, и SQL с этими заполнителями станет передаваемым текстом. Но вы правы, проблема была в: полях.
  • 1
    @Dracontis - если вы посмотрите Bind Variables, это должно объяснить понятие. Некоторые базы данных будут профилировать запросы в зависимости от того, какие переменные могут быть связаны, а какие являются статическими. Их можно использовать, чтобы избежать атак с использованием SQL-инъекций, только передав переменную для этого столбца, и они также позволяют многократно выполнять подготовленные операторы, отправляя значения в базу данных, а не весь оператор, чтобы упомянуть несколько случаев использования.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню