#postgresql #hibernate #jdbc
#postgresql #спящий режим #jdbc
Вопрос:
Я получаю эту ошибку:
org.postgresql.util.PSQLException: No value specified for parameter 1.
Для такого рода запросов:
UPDATE user
SET Email = 'fake.' || id::varchar || '@localhost'
WHERE Email is not null and char_length(Email)>0 and removed=false and id in (:ids)
Я запускаю этот запрос как собственный запрос следующим образом:
sessionFactory.getCurrentSession()
.createSQLQuery(sql)
.setParameterList("ids", ids)
.executeUpdate()
;
Похоже id::varchar
, это сбивает с толку Hibernate или JDBC. Возможно, есть какой-нибудь способ избежать этого? Довольно стандартный синтаксис Postgres для приведения типов. Мне не нравится синтаксис приведения, и я предпочел бы использовать это сопоставление типов.
Ответ №1:
Используйте concat()
, который автоматически приведет к приведению идентификатора:
UPDATE user
SET Email = concat('fake.', id, '@localhost')
WHERE Email is not null
and char_length(Email) > 0
and removed = false
and id in (:ids)
В качестве альтернативы используйте стандартный оператор приведения:
UPDATE user
SET Email = 'fake.' || cast(id as text) || '@localhost'
WHERE Email is not null
and char_length(Email) > 0
and removed = false
and id in (:ids)
Комментарии:
1. Хм… Интересно, что concat выполняет приведение автоматически, а lpad — нет 😕. И я действительно предпочитаю это:
lpad(id::varchar, 8, '0')
, над этим:lpad(cast(id as varchar), 8, '0')