甲骨文数据库。
使用 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);
最终 Clob 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”时参数的数量或类型错误只要不破坏最大字符串值,我也可以将值作为字符串传递
我看过一篇文章(在带有 clob 参数的 where 子句中使用函数),这似乎表明唯一的方法是使用“普通的旧 JDBC”。这不是一个选择。我面临着一个艰难的最后期限,所以非常欢迎任何帮助。