Я использую Java 8 и имею запрос на обновление с тремя столбцами, объединенными в один в предложенииwhere. запрос отлично работает на SQL Server, но когда я выполняю его из кода, это приводит к неправильной синтаксической ошибке.
Запрос, используемый в коде:
@Modifying
@Transactional
@Query(value = "UPDATE ListView SET stre_group = :streGroup, method = :mthodSelected, " +
"alloc_schedule = :allocationSchedule " +
"WHERE concat(job_id,':',item_nr,':',whse_nr) IN (:resultValue)", nativeQuery = true)
void updateWorklist(String streGroup, String mthodSelected,
List<String> allocationSchedule ,
List<String> resultValue);
БД:
UPDATE tablename SET stre_group = 'store 4', method = 'store 4',
auto_alloc_action = 'store 4', alloc_schedule = 'store 4'
WHERE concat(job_id,':',item_nbr,':',whse_nbr) IN ('1:10:1')
Я попытался проверить синтаксис и не нашел причины проблемы.
ОШИБКА o.h.engine.jdbc.spi.SqlExceptionHelper: неверный синтаксис рядом с ','.
? ОШИБКА 29524 i.m.ca.service.updateDataService: произошла ошибка при обновлении записей: не удалось выполнить оператор; SQL [н/д]; вложенное исключение: org.hibernate.Exception.SQLGrammarException: не удалось выполнить оператор.
@FedericoklezCulloca: Я включил ведение журнала, оно печатается следующим образом: Hibernate: UPDATE ListView SET stre_group = ?, метод = ?, alloc_schedule = ? ГДЕ concat(job_id,':',item_nr,':',whse_nr) IN ( ? )
item_nbr и whse_nbr в вашем SQL-запросе пишутся по-разному, чем в строке, где вы пишете их как item_nr и whse_nr.
Вкратце alloc_schedule = :allocationSchedule
пока вы передаете ему список: List<String> allocationSchedule
то, что выполняет база данных, не совсем то, что происходит в приложении.
Они не вызовут синтаксическую ошибку SQL, @SledgeHammer , но все же имеют смысл.
Ваша проблема возникает из-за того, что один из параметров, передаваемых в запрос, имеет тип List
, а в запросе вы используете знак равенства =
. Причина, по которой он работает в базе данных, заключается в том, что вы не используете тот же самый параметр в приложении.
По сути, эта часть запроса: alloc_schedule = :allocationSchedule
Поскольку параметр равен List<String> allocationSchedule
, окончательный выполняемый запрос будет выглядеть примерно так:
UPDATE ...., alloc_schedule = 'store 4', 'SomeOtherValueInTheList' WHERE ...
Отсюда и ошибка: SqlExceptionHelper : Incorrect syntax near ','.
Поэтому вам нужно исправить параметр, чтобы он представлял собой простую строку (и, очевидно, вызывающие этот метод)
Спасибо. Исправлен параметр, все работает нормально.
К вашему сведению, вы можете включить ведение журнала запросов и посмотреть, что это за запрос.