3

古いバージョンの Eclipse (私の記憶が正しければ Ganymede) で開発された Java EE Web アプリケーションがあります。最近、Kubuntu 12.04 LTS に移行し、アプリケーションを Eclipse Kepler (Eclipse Web サイトからダウンロードしてインストールしたもの) に移行しました。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

しかし、これはちょっと面倒なので、変更するページがたくさんあります。しかし、とにかく問題を経験するべきではないので、それは学術的です.

読んでくれてありがとう。どんな助けでも大歓迎です。

4

1 に答える 1

6

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)ます。

見る:

ここでの教訓:アップグレードする前に、メジャー バージョン アップグレードのリリース ノートを必ずお読みください。

見出し

于 2013-08-08T15:24:24.740 に答える