Конфликт между приведением типов Postgres и привязкой параметров

#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')