2010-05-08 3 views
8

У меня проблема с Hibernate Native Query. У меня есть один SELECT, который выбирает срез массива (база данных PostgreSQL).Задача Hibernate Native Query с именованными параметрами

Проблема заключается в том, что спящий режим распознает следующие части: «: 300» от «SELECT my_array [1: 300] ...» в качестве имени параметра, и я получаю следующее исключение: Не все названные параметры были установлены.

Я попытался избежать двоеточия (:) с помощью:: ',' :: ', но без успеха.

Hibernate версия 3,2

ответ

4

Я не использую PostgreSQL, но если вы не можете найти правильное решение этой проблемы вы можете реализовать перехватчик (расширить EmptyInterceptor) и изменить свой запрос на onPrepareStatement(String sql).

Это означает, что вы можете использовать что-то вроде my_array[1|300] и переписать его как my_array[1:300], чтобы обойти проблему с именованными параметрами.

Редактировать: Я не уверен на 100% вышеприведенной работе (переписывание собственного SQL и вопрос, разрешающий ли синтаксис запроса специальный символ). Я только сделал это в HQL и критерии, когда я передавал подсказку индекса как комментарий.

+0

Спасибо, работает также с коренными запросами :) – dime

3

Двоеточие не сбрасывается в самом спящем режиме (известный с Bug с 2005 года).

1
create function array_slice(a anyarray, start int4, end int4) returns anyarray as 
$$ 
    SELECT a[start:end]; 
$$ 
language(sql); 

Теперь вызовите эту функцию вместо этого. Не пробовал, но это будет так или иначе.

1

MyInterceptor extends EmptyInterceptor Работы, упомянутые cherouvim.

не забудьте

<property name="hibernate.ejb.interceptor" value="MyInterceptor"/> 

в persistence.xml

Смежные вопросы