2011-08-08 16 views
0

私はDerbyデータベースを使用しています。私はこのクエリを書いた:PreparedStatementのBLOB型の比較

InputStream is = new java.io.ByteArrayInputStream(BYTES); 
PreparedStatement st11 = conn.prepareStatement("select f from a1 where dBlob =?)"); 
st11.setBlob(1,is,BYTES.length); 

dBlobはBLOBデータ型です。 また、BYTESはBLOBデータ型です。

しかし、私はこのクエリを実行すると、私は次の例外を取得:

によって引き起こさ

:ERROR 42818:「BLOB」と「BLOB」の間の比較はサポートされていません。 タイプは同等でなければなりません。文字列型も照合順序が一致している必要があります。共同 llationが一致しない場合は、可能な解決策は、

(VARCHAR AS CAST(TABL ENAME(128))= 'T1' sys.systables FROMテーブル名を選択など) にデフォルトの照合を、それらを強制的にオペランドをキャストすることです

この問題を回避するためにクエリを作成するにはどうすればよいですか?私はまた、変換使って試してみましたが、それはあまりにも動作しません

PreparedStatement st11 = conn.prepareStatement("select f from a1 where dBlob  
=CONVERT(?,BINARY)"); 
st11.setBlob(1,is,BYTES.length); 

はまた、中に渡される引数のデータ型を取得することは可能でしょうか?反射によって、または他の何らかの手段によって。

答えて

1

BLOB列で直接検索できないことは非常に基本的な制限であり、私はあなたがそれを回避することはできないと思います。

アプリケーションでBLOBデータの完全一致でデータベースを日常的に検索する必要がある場合は、アプリケーションで一般的に行うことは、VARCHAR(128)型の追加の列をデータベースに追加し、SHA-ハッシュ・カラムのBLOB値の1ハッシュ

データベースを検索するには、検索するBLOBのハッシュを計算し、完全一致のハッシュカラムを検索します。

+0

ありがとうブライアン。私はその問題を解決しました。 私はいくつかの理由でPreparedStatementで設定されているパラメータの型を比較しています。すべてのLOBに対して一般的な比較タイプを指定することは可能ですか、それともCLOB、BLOB、およびnCLOBの各データ型を個別に比較する必要がありますか? – krammer