オラクル DB。
Hibernate を使用した Spring JPA。
Clob 値をネイティブ SQL クエリに挿入するのが困難です。クエリを呼び出すコードは次のとおりです。
@SuppressWarnings("unchecked")
public List<Object[]> findQueryColumnsByNativeQuery(String queryString, Map<String, Object> namedParameters)
{
List<Object[]> result = null;
final Query query = em.createNativeQuery(queryString);
if (namedParameters != null)
{
Set<String> keys = namedParameters.keySet();
for (String key : keys)
{
final Object value = namedParameters.get(key);
query.setParameter(key, value);
}
}
query.setHint(QueryHints.HINT_READONLY, Boolean.TRUE);
result = query.getResultList();
return result;
}
クエリ文字列は次の形式です
SELECT COUNT ( DISTINCT ( <column> ) ) FROM <Table> c where (exact ( <column> , (:clobValue), null ) = 1 )
ここで、「(exact ( , (:clobValue), null ) = 1 )」は関数で、「clobValue」は Clob です。
次のように動作するようにクエリを調整できます。
SELECT COUNT ( DISTINCT ( <column> ) ) FROM <Table> c where (exact ( <column> , to_clob((:stringValue)), null ) = 1 )
「stringValue」は文字列ですが、明らかにこれは最大のSQL文字列サイズ(4000)までしか機能せず、それ以上のものを渡す必要があります。
メソッドを使用して Clob 値を java.sql.Clob として渡そうとしました
最終 Clob clobValue = org.hibernate.engine.jdbc.ClobProxy.generateProxy(stringValue);
これにより、
java.io.NotSerializableException: org.hibernate.engine.jdbc.ClobProxyが発生します。
を使用してClobをシリアライズしようとしました
最終 Clob clob = org.hibernate.engine.jdbc.ClobProxy.generateProxy(stringValue);
最終クロブ clobValue = SerializableClobProxy.generateProxy(clob);
しかし、これは「正確な」関数に間違ったタイプの引数を提供しているようで、結果として
(org.hibernate.engine.jdbc.spi.SqlExceptionHelper:144) - SQL エラー: 29900、SQLState: 99999 (org.hibernate.engine.jdbc .spi.SqlExceptionHelper:146) - ORA-29900: 演算子バインディングが存在しません ORA-06553: PLS-306: 'EXACT' の呼び出しで引数の数またはタイプが正しくありません
エンティティでの Clob の使用に関する投稿を読んだ後、byte[] を渡そうとしましたが、これも間違った引数の型
(org.hibernate.engine.jdbc.spi.SqlExceptionHelper:144) を提供します - SQL エラー: 29900、SQLState: 99999 (org.hibernate.engine.jdbc.spi.SqlExceptionHelper:146) - ORA-29900: 演算子バインディングが存在しません ORA-06553: PLS-306: 'EXACT' の呼び出しで引数の数またはタイプが正しくありません最大文字列値を壊さない限り、値を文字列として渡すこともできます
唯一の方法は「プレーンな古い JDBC」を使用することであることを示唆しているように思われる投稿 ( Using function in where clause with clob parameter ) を見ました。これはオプションではありません。私は厳しい締め切りに直面しているので、どんな助けも大歓迎です.