barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

вторник, 24 июля 2012 г.

Hibernate: SQLQuery и двоеточия в тексте запроса

Задача следующая: выполнить с помощью Hibernate некоторый SQL-запрос к БД PostgreSQL (используя session.createSQLQuery()), использующий приведение типов с помощью "::", например:
SELECT SETVAL('mysequence'::regclass,11111)
Проблема заключается в том, что Hibernate использует двоеточие для реализации именованных параметров запроса, поэтому "::regclass" воспринимается им как параметр с именем ":regclass", что в итоге приводит к ошибке при выполнении запроса, т.к. значение для этого параметра не задано:
...
Caused by: org.hibernate.exception.DataException: Не указано значение для параметра 1.
...
Caused by: org.postgresql.util.PSQLException: Не указано значение для параметра 1.
Никаких способов экранирования двоеточия, насколько я понял, нет (соответствующий тикет висит аж с 2005 года и версии 3.1: https://hibernate.onjira.com/browse/HHH-1237, - тогда как я проверяю на версии 4.1). Хорошо хоть, что в PostgreSQL есть и другой способ приведения типов - с помощью конструкции CAST:
SELECT SETVAL(CAST('mysequence' AS regclass),11111)
Но для других БД, где в SQL применяется двоеточие для такой же или другой цели, таких замен может и не быть. 

3 комментария:

  1. Спасибо, сэкономил время.

    ОтветитьУдалить
  2. Спасибо большое за статью! ато я уже голову сломала, пытаясь понять, почему не идет insert :)

    ОтветитьУдалить
  3. У меня вот так получилось
    \\:\\:

    ОтветитьУдалить