2011-08-08 4 views
0

J'utilise la base de données Derby. J'ai écrit cette requête:Comparer les types de Blob dans PreparedStatement

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

dBlob est un type de données BLOB. BYTES est également un type de données BLOB.

Mais je reçois l'exception suivante quand j'exécute cette requête:

Causée par: ERREUR 42818: Les comparaisons entre les « blob » et « blob » ne sont pas pris en charge. Les types doivent être comparables. Les types de chaîne doivent également avoir un classement correspondant. Si co llation ne correspond pas, une solution possible est de jeter opérandes pour les forcer à le classement par défaut (par exemple SELECT tablename DE sys.systables OU CAST (tabl Ename AS VARCHAR (128)) = 'T1')

Comment écrire la requête pour contourner ce problème?

J'ai aussi essayé d'utiliser Convertir, mais il ne fonctionne pas avec cela aussi:

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

De plus, est-il possible d'obtenir le type de l'argument étant passé dans? par la réflexion ou par d'autres moyens.

Répondre

1

L'impossibilité de rechercher directement sur une colonne BLOB est une limitation très fondamentale, et je ne pense pas que vous serez capable de la contourner. Si votre application nécessite que vous recherchiez régulièrement la base de données par correspondance exacte sur les données BLOB, ce que je fais généralement dans mes applications est d'ajouter une colonne supplémentaire à la base de données, de type VARCHAR (128), et de stocker un SHA- 1 hachage de la valeur BLOB dans la colonne de hachage. Puis, pour effectuer une recherche dans votre base de données, calculez le hachage du blob que vous voulez rechercher et recherchez la correspondance exacte dans la colonne de hachage.

+0

Merci Bryan. J'avais résolu ce problème. Je compare les types de paramètres définis dans PreparedStatement pour certaines raisons. Est-il possible de donner un type de comparaison générique pour tous les objets LOB ou dois-je comparer spécifiquement pour chacun des types de données CLOB, BLOB et nCLOB? – krammer

Questions connexes