java - 使用 Postgres 8.2 时出现错误 : operator does not exist: integer = character varying,

标签 java eclipse postgresql jstl el

我有一个用旧版本的 Eclipse(如果我没记错的话是 Ganymede)开发的 Java EE Web 应用程序。我最近迁移到 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

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

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

最佳答案

您可能正在使用 PostgreSQL 8.2 JDBC 驱动程序,但看起来您正在使用较新的 PostgreSQL 服务器 版本。尝试:

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

参见:

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

标题

关于java - 使用 Postgres 8.2 时出现错误 : operator does not exist: integer = character varying,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18128806/

相关文章:

java - 未找到 SQL 驱动程序 - 但已实现驱动程序 JAR 文件

android - SDK Manager中Android 4.4W(API20)和Android L(API20,L Preview)有什么区别?

java - eclipse ubuntu 18.04安装java.lang.ClassNotFoundException :

android - 当一个应用程序运行时,另一个应用程序将被删除

python - 检测 postgresql 数据库中子网重叠的最佳方法

postgresql - Postgres 子查询按日期分组

Javafx 无法在 Debian8 Arm 设备 NanoPC T3 上运行

java - Java代码注释中使用方括号的目的是什么?

java - 在嵌入式 Jetty 实例上运行的 JSP 页面中未解析 JSTL

sql - PostgreSQL 查询问题 2