0
我们正在使用@NamedNativeQuery
从我们的数据库中获取由查询的where子句中的存储过程flexmatch
限定的实体。在clob参数中使用where子句中的函数
这工作总体正常,但在参数chimeString
超过4.000个字符失败筹集以下异常:
ORA-01460:未实现或不合理的转换要求
这有一定道理因为4.000字符是Oracle在String和Clob之间的边界。
我们试图
使用
org.hibernate.engine.jdbc.ClobProxy
return entityManager .createNamedQuery("Structure.findByExactMatch", Structure.class) .setParameter("chime", ClobProxy.generateProxy(chimeString)) .getResultList();
使用
javax.persistence.criteria.ParameterExpression
与org.hibernate.engine.jdbc.ClobProxy
ParameterExpression<Clob> chimeParam = entityManager .getCriteriaBuilder() .parameter(Clob.class, "chime"); return entityManager .createNamedQuery("Structure.findByExactMatch", Structure.class) .setParameter(chimeParam, ClobProxy.generateProxy(chimeString)) .getResultList();
Librarie在一起小号&系统:
- 的Oracle 11g
- 的Hibernate 3.6.6
find方法。
public List<Structure> findByExactMatch(String chimeString) {
return entityManager
.createNamedQuery("Structure.findByExactMatch", Structure.class)
.setParameter("chime", chimeString)
.getResultList();
}
结构实体。
@Entity
@NamedNativeQueries({
@NamedNativeQuery(
name = "Structure.findByExactMatch",
query = "SELECT id, molfile(ctab) ctab FROM structure " +
"WHERE flexmatch(ctab, :chime, 'all')=1",
resultClass = Structure.class) })
public class Structure {
@Id
@Column(name = "ID")
private long id;
@Lob
@Column(name = "CTAB")
private String ctab;
// getter & setter
}
编辑1 PL/SQL的功能,你可以看到它是超载。
FUNCTION flexmatch(
molobj IN BLOB,
querymol IN VARCHAR2,
args IN VARCHAR2)
RETURN NUMBER
FUNCTION Flexmatch(
molobj IN BLOB,
querymol IN CLOB,
args IN VARCHAR2)
RETURN NUMBER