2013-11-20 41 views
0

我们正在使用@NamedNativeQuery从我们的数据库中获取由查询的where子句中的存储过程flexmatch限定的实体。在clob参数中使用where子句中的函数

这工作总体正常,但在参数chimeString超过4.000个字符失败筹集以下异常:

ORA-01460:未实现或不合理的转换要求

这有一定道理因为4.000字符是Oracle在String和Clob之间的边界。

我们试图

  1. 使用org.hibernate.engine.jdbc.ClobProxy

    return entityManager 
        .createNamedQuery("Structure.findByExactMatch", Structure.class) 
        .setParameter("chime", ClobProxy.generateProxy(chimeString)) 
        .getResultList(); 
    
  2. 使用javax.persistence.criteria.ParameterExpressionorg.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 

回答

0

经过几天的尝试,我们放弃了在Hiberante内解决它。我们使用SpringJDBC运行查询,SpringJDBC也出现在项目中,并使用ID填充Hiberante实体。你也可以用简单的旧JDBC来做到这一点。