在hibernate中执行包

时间:2018-03-12 20:54:42

标签: java oracle hibernate

我需要通过Hibernate运行一个包,

create or replace PACKAGE BODY "ZIMFUNC" AS
...
FUNCTION ISNUMBER(value IN VARCHAR)
  RETURN NUMBER DETERMINISTIC 
AS
  RC NUMBER;
BEGIN
  IF (value IS NULL)
  THEN
    RETURN 0;
  END IF;
  RC := TO_NUMBER(value);
  RETURN 1;
EXCEPTION
  WHEN OTHERS THEN
    RETURN 0;
END;
...

我通过Java方法调用这个包

public Causer criarUsuarioOracle(Causer entity) {
    String user = entity.getUserlogin().trim();             
    try {           
        executeSql(z.getSql4());            
    } catch (DaoException e) {
        System.out.println("O usuario "+entity.getUserlogin()+" foi criado mas ja existe um user do oracle com esse nome.");
        e.printStackTrace();
    }
    entity.setUsercriabd('S');      
    return entity;
}

public void executeSql(String sql) throws DaoException {
    Transaction t = startTransaction();
    try{            
        getSession().createSQLQuery(sql).executeUpdate();
        commitTransaction(t);
    }catch(HibernateException e){
        rollbackTransaction(t);
        e.printStackTrace();
        throw e;
    }finally{
        if (isAutoCommit()) {
            getSession().close();
        }
    }
}

但它给出以下错误消息。

org.hibernate.QueryException: Space is not allowed after parameter prefix ':' 'create or replace PACKAGE BODY "ZIMFUNC" AS FUNCTION ... (SQL FUNCTION ABOVE) ... END'
at org.hibernate.engine.query.ParameterParser.parse(ParameterParser.java:92)
at org.hibernate.engine.query.ParamLocationRecognizer.parseLocations(ParamLocationRecognizer.java:75)
at org.hibernate.engine.query.QueryPlanCache.buildNativeSQLParameterMetadata(QueryPlanCache.java:149)
at org.hibernate.engine.query.QueryPlanCache.getSQLParameterMetadata(QueryPlanCache.java:79)
at org.hibernate.impl.AbstractSessionImpl.createSQLQuery(AbstractSessionImpl.java:146)
at org.hibernate.impl.SessionImpl.createSQLQuery(SessionImpl.java:1656)
at br.gov.es.dataci.commonshibernate.dao.impl.GenericDao.executeSql(GenericDao.java:484)
at br.gov.es.dataci.controleacesso.persistence.dao.impl.CauserDaoImpl.criarUsuarioOracle(CauserDaoImpl.java:251)
at br.gov.es.dataci.controleacesso.persistence.dao.impl.CauserDaoImpl.main(CauserDaoImpl.java:302)

它理解字符':'需要一个Hibernate参数

我在Java字符串(SQL FUNCTION)中的':'之前插入了两个反斜杠,但错误仍然存​​在。

有人能帮助我吗?

1 个答案:

答案 0 :(得分:0)

我按照Maruisz S的指示解决了问题

如果您不将Hibernate升级到4.1.3。版 "只需在查询中使用/ ' /:= / ' /。 Hibernate代码处理'之间的所有内容。作为一个字符串(忽略它)。另一方面,MySQL和Oracle将忽略blockquote中的所有内容,并将整个表达式计算为一个assignement运算符。 我知道它快速而肮脏,但它完成了没有存储过程,拦截器等工作。"

通过链接:How can I use MySQL assign operator(:=) in hibernate native query?