错误:运算符不存在:整数=字符变化,使用Postgres 8.2

时间:2013-08-08 14:34:50

标签: java eclipse postgresql jstl el

我有一个用旧版Eclipse开发的Java EE Web应用程序(Ganymede,如果我没记错的话)。我最近迁移到Kubuntu 12.04 LTS并将应用程序迁移到Eclipse Kepler(我从Eclipse网站下载并安装)。它使用的是Java Compliance Level 1.6,目标容器是Tomcat 6。

我的问题是我现在收到错误:

org.postgresql.util.PSQLException:错误:运算符不存在:整数=字符变化

当应用程序遇到包含某个Postgres查询的页面时。我正在使用JSTL sql:query和sql:param标签在jsp页面中实现预准备语句。我知道这被认为是不好的做法,但我不是原作者,这种技术在整个应用程序中使用。

发生错误是因为尝试将字符串分配给sql:param标记中的整数。在之前的设置中,任何投射都是透明的,并且没有错误。使用新设置我收到错误。

我读到Postgres 8.3引入了更严格的类型转换会导致此错误,但我在我的应用程序中使用Postgres 8.2 JDBC 4 jar文件,因此它应该可以工作。我很难过。也许有人有想法?

我遇到了一种解决方法,在进行比较之前将字符串乘以1:

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

但这有点像kludge,我会有很多页面需要修改。但这是学术性的,因为无论如何我不应该遇到这个问题。

感谢阅读。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:6)

您可能正在使用PostgreSQL 8.2 JDBC驱动程序,但看起来您正在使用较新的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)

请参阅:

此处的教训:在升级之前始终阅读主要版本升级的发行说明

标题