2013-08-08 4 views
3

У меня есть веб-приложение Java EE, разработанное в старой версии Eclipse (Ganymede, если я правильно помню). Недавно я перешел на Kubuntu 12.04 LTS и перенес приложение в Eclipse Kepler (которое я загрузил и установил с веб-сайта Eclipse). Он использует Java Уровень соответствия 1.6 и целевой контейнер Tomcat 6.ОШИБКА: оператора не существует: integer = символ меняется, используя Postgres 8.2

Моя проблема заключается в том, что теперь я получаю ошибку:

org.postgresql.util.PSQLException: ОШИБКА: оператор не существует: целое число = символ меняется

когда приложение встречает страницу с определенным запросом Postgres. Я использую JSTL sql: query и sql: param для реализации подготовленного оператора на странице jsp. Я знаю, что это считается плохой практикой, но я не автор оригинала, и этот метод используется во всем приложении.

Ошибка возникает из-за попытки присвоить строку целому числу в теге sql: param. В предыдущей настройке кастинг проходил прозрачно, и ошибки не было. С новой настройкой я получаю сообщение об ошибке.

Я прочитал, что более строгий тип кастинга был введен с Postgres 8.3, который мог бы вызвать эту ошибку, но я использую jar-файл Postgres 8.2 JDBC 4 в своем приложении, чтобы он работал. Я в тупике. Может, у кого-то есть идея?

я наткнулся на обходной путь, чтобы умножить строку на 1 перед выполнением сравнения:

http://dev-answers.blogspot.co.uk/2010/08/type-coercion-in-jstl-for-sqlparam.html

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

Спасибо за чтение. Любая помощь очень ценится.

ответ

6

Возможно, вы используете драйвер JDBC PostgreSQL 8.2, но похоже, что вы используете новый сервер PostgreSQL . Попытка:

SELECT version() 

Betcha - 8.3 или новее.

Эти запросы не совсем правильные и предпочтительно должны быть исправлены. Если вы должны изменить системные каталоги, чтобы разрешить передачу неявно, но это должно быть временным обходным решением, пока вы не сможете исправить запросы, отправляемые приложением. Обходной путь, предложенный в этом сообщении в блоге, ужасен, но так же, как и JSTL, если он не предлагает типы бросков на сильно типизированном языке. Лично я был бы более склонен к силе явного принуждения в запросе, например, в примере блога:

<sql:query var="examples" dataSource="${exampleDataSource}"> 
    select ExampleName as "name" 
    from ExampleTable 
    where ExampleId = ?::integer 
    order by ExampleName ASC 
    <sql:param value="${param['ID']}"/> 
</sql:query> 

? :: integer является типа отливать в сокращенном синтаксисе PostgreSQL. Вы можете написать стандарт SQL CAST(? AS integer), если хотите.

См:

Урок здесь: Всегда читайте примечания к выпуску крупных обновлений версий перед обновлением.

Заголовок
+0

Да, это произошло со мной прошлой ночью, что номер версии является то, что PostgreSQL на сервере, а не версии баночки. Мы используем 9.1.2. Ваше решение на месте, спасибо очень! – user2661243

+0

Мне было интересно, почему это сработало раньше. Серверная версия PostgreSQL была такой же. Очень странно. – user2661243

+0

@ user2661243 Я не мог объяснить это, если, возможно, ваш JSTL не вызвал параметры, которые раньше соответствовали типам, ожидаемым БД. Сравнение целого числа с текстом не должно работать без добавления в 8.3 или любой последующей версии сервера. –

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