【问题标题】:ERROR: operator does not exist: integer = character varying, using Postgres 8.2错误:运算符不存在:整数 = 不同的字符,使用 Postgres 8.2
【发布时间】:2013-08-10 07:55:18
【问题描述】:

我有一个在旧版本的 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

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

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

【问题讨论】:

    标签: java eclipse postgresql jstl el


    【解决方案1】:

    您可能使用的是 PostgreSQL 8.2 JDBC 驱动程序,但看起来您使用的是较新的 PostgreSQL server 版本。试试:

    SELECT version()
    

    它是 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 速记语法中的 type cast。如果您愿意,可以编写 SQL 标准 CAST(? AS integer)

    见:

    这里的教训:请务必阅读主要版本升级的发行说明在升级之前

    标题

    【讨论】:

    • 是的,昨晚突然想到,版本号是服务器上PostgreSQL的版本号,而不是jar版本。我们使用的是 9.1.2。非常感谢您的解决方案!
    • 我想知道为什么它以前有效。 PostgreSQL 的服务器版本是相同的。很奇怪。
    • @user2661243 我无法解释那个,除非您的 JSTL 碰巧产生了与数据库之前预期的类型相匹配的参数。在 8.3 或任何更高版本的服务器中,如果没有强制转换,将整数与文本进行比较是无法工作的。
    猜你喜欢
    • 2011-02-09
    • 2023-03-15
    • 2014-04-05
    • 1970-01-01
    • 2016-04-16
    • 2011-07-03
    • 2018-08-03
    • 1970-01-01
    相关资源
    最近更新 更多