Я использую 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
Я попытался преобразовать массив в строку со значениями, разделенными запятыми, но это дало мне такую же ошибку. Что мне делать? Или, если у вас есть лучшие идеи, что использовать, для создания пользовательских запросов, пожалуйста, опубликуйте эту идею в комментариях.
Вы не можете использовать метки значений ("?") Для вещей, которые не являются значениями (например, ваши имена полей).
Если вы действительно хотите это сделать, просто создайте запрос, сопоставив имена полей в. Затем примените значения с помощью заполнителей.
НО убедитесь, что вы проверяете имена полей так, как вы ожидали, и убегайте/цитируйте их правильно.
Ох - Не программист на Java, но проверьте, что keySet() и values () возвращают свои результаты в том же порядке.
Редактировать:
"?" Знаки являются знаменателями. Они используются в библиотеках всех подключений. Они будут сопоставлены с любым параметризованным синтаксисом запроса, который может использовать база данных. Однако они работают только для значений - поэтому база данных может анализировать запрос с помощью заполнителей.