ordinal parameter mismatch

hibernate 的bug org.hibernate.HibernateException: ordinal parameter mismatch

(2012-04-13 14:23:42)
标签: 

hibernate

 

hql

 

criteria

 

ordinal

 

parameter

 

mismatch

 

it

分类: IT异常分析
只要 在hql中出现call字符串,不论是以独立单词、还是以作为组合单词的一部分出现,hibernate都会抛出下列异常:
org.hibernate.HibernateException: ordinal parameter mismatch
at org.hibernate.engine.query.HQLQueryPlan.buildParameterMetadata(HQLQueryPlan.java:225)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:95)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:54)
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:71)
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1583)
......
上网找了很长时间,也没有找到相关的错误分析
最后终于在源代码中找到了这个错误的源头
在org.hibernate.engine.query.ParameterParser类中有下列一段代码
public static void parse(String sqlString, Recognizer recognizer) throws QueryException{
       boolean hasMainOutputParameter = sqlString.indexOf( "call" ) > 0 &&
                                                                     sqlString.indexOf( "?" ) < sqlString.indexOf( "call" ) &&
                                                                     sqlString.indexOf( "=" ) < sqlString.indexOf( "call" );
       ......
}
我们都知道hibernate3可以调用存储过程或函数,但是有一定的限制(具体可以查看hibernate官方手册)。
据我分析这段代码应该是用来分析字符串是否是调用存储过程或函数的语句。

解决方法:
1.不要在表或列中,出现"call"字样
2.用Criteria来代替hql语句

以下是关于Criteria用法的例子:

 
public List getCalldetailByDate(String hts,String hte,int accountid){ 
       String sda = hts + " " + "00:00:00"; 
       String eda = hte + " " + "23:59:59"; 
       Calendar start_calendar = ParseDate.parseDateTime(sda);   //parseDate是一个将字符串格式的转化为Calendar的一个方法 
       Date start_date = start_calendar.getTime(); 
       //System.out.println(start_date); 
       Calendar end_calendar = ParseDate.parseDateTime(eda); 
       Date end_date = end_calendar.getTime(); 
       //System.out.println(end_date); 
       Criteria criteria = this.getSession().createCriteria(Calldetail.class);     
       criteria.add(Expression.eq("accounts.u_accountid",accountid)); 
       criteria.add(Expression.eq("u_callresult","1")); 
       criteria.add(Expression.eq("u_callstate","1")); 
       criteria.add(Expression.between("u_ostarttime", start_date, end_date)); 
       Criteria.addOrder(Order.desc("id"))
       List list = criteria.list(); 
       return list; 
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值