Сравнение типов BLOB-объектов в 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 — это тип данных BLOB. BYTES также является типом данных BLOB.

Но при выполнении этого запроса я получаю следующее исключение:

Причина: ОШИБКА 42818: сравнение между «BLOB» и «BLOB» не поддерживается. Типы должны быть сопоставимы. Строковые типы также должны иметь соответствующие параметры сортировки. Если сопоставление не совпадает, возможное решение состоит в том, чтобы привести операнды к сопоставлению по умолчанию (например, SELECT tablename FROM sys.systables WHERE CAST(table name AS VARCHAR(128)) = 'T1')

Как написать запрос, чтобы обойти эту проблему?

Я также пытался использовать Convert, но это тоже не работает:

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

Более того, можно ли получить тип данных передаваемого аргумента? путем отражения или каким-либо другим способом.


person krammer    schedule 08.08.2011    source источник


Ответы (1)


Невозможность поиска непосредственно в столбце BLOB является фундаментальным ограничением, и я не думаю, что вы сможете его обойти.

Если ваше приложение требует регулярного поиска в базе данных по точному совпадению с данными BLOB, я обычно делаю в своих приложениях добавление в базу данных дополнительного столбца типа VARCHAR(128) и сохранение хэша SHA-1 Значение BLOB в хэш-столбце.

Затем, чтобы выполнить поиск в базе данных, вычислите хеш большого двоичного объекта, который вы хотите найти, и найдите точное совпадение в столбце хэша.

person Bryan Pendleton    schedule 11.08.2011
comment
Спасибо Брайан. Я решил эту проблему. Я сравниваю типы параметров, устанавливаемых в PreparedStatement по определенным причинам. Можно ли указать общий тип сравнения для всех LOB или мне нужно сравнивать конкретно для каждого из типов данных CLOB, BLOB и nCLOB? - person krammer; 12.08.2011