我需要通过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)中的':'之前插入了两个反斜杠,但错误仍然存在。
有人能帮助我吗?
答案 0 :(得分:0)
我按照Maruisz S的指示解决了问题
如果您不将Hibernate升级到4.1.3。版 "只需在查询中使用/ ' /:= / ' /。 Hibernate代码处理'之间的所有内容。作为一个字符串(忽略它)。另一方面,MySQL和Oracle将忽略blockquote中的所有内容,并将整个表达式计算为一个assignement运算符。 我知道它快速而肮脏,但它完成了没有存储过程,拦截器等工作。"
通过链接:How can I use MySQL assign operator(:=) in hibernate native query?