【问题标题】:Execute package in hibernate在休眠中执行包
【发布时间】:2018-08-21 00:07:53
【问题描述】:

我需要通过 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) 中的 ':' 之前插入了两个反斜杠,但错误仍然存​​在。

谁能帮帮我?

【问题讨论】:

  • 请发一个minimal reproducible example,包括调用java代码。和完整的堆栈跟踪。请将这些添加内容放在问题正文中,而不是 cmets 部分。谢谢
  • 不要将“SOLVED”放在问题的标题中。 接受解决您问题的答案。这是将问题标记为已解决的唯一方法。接受自己的答案并没有错。

标签: java oracle hibernate


【解决方案1】:

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

如果您不将 Hibernate 升级到 4.1.3。版本 “只需在查询中使用 /'/:=/'/。休眠代码将 ' 之间的所有内容视为字符串(忽略它)。另一方面,MySQL 和 Oracle将忽略块引用中的所有内容,并将整个表达式评估为赋值运算符。 我知道它又快又脏,但它可以在没有存储过程、拦截器等的情况下完成工作。”

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

【讨论】:

    猜你喜欢
    • 2013-01-23
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多