[Hibernate框架]Hql语句in中带参数的写法

最近遇到两次在hql的in中传递参数的问题,最初让我纠结万千。

 

在dao层已经封装好了一个使用hql获取数据的方法:

Java代码   收藏代码
  1. public List<?> findByHql(String hql, Map<String, Object> map, int pageSize,int pageNo) {  
  2.     return this.getQuery(hql, map, pageSize, pageNo).list();  
  3. }  
  4.   
  5.   
  6. private Query getQuery(String hql, Map<String, Object> map, int pageSize,int pageNo) {  
  7.     Query query = this.createQuery(hql);  
  8.     query = this.setParameter(query, map);  
  9.     query = this.setPageProperty(query, pageSize, pageNo);  
  10.     return query;  
  11. }  
  12.   
  13. private Query createQuery(String hql) {  
  14.     return getSession().createQuery(hql);  
  15. }  
  16.   
  17. private Query setParameter(Query query, Map<String, Object> map) {  
  18.     if (map != null) {  
  19.         Set<String> keySet = map.keySet();  
  20.         for (String string : keySet) {  
  21.             Object obj = map.get(string);                     
  22.             query.setParameter(string, map.get(string));      
  23.         }  
  24.     }  
  25.     return query;  
  26. }  
  27.   
  28. private Query setPageProperty(Query query, int pageSize, int pageNo) {  
  29.     if (pageNo != 0 && pageSize != 0) {  
  30.         query.setFirstResult((pageNo - 1) * pageSize);  
  31.         query.setMaxResults(pageSize);  
  32.     }  
  33.     return query;  
  34. }  

 

通常在业务层只需要写相应的hql,然后把对应参数封装到map中,即可查询出自己需要的数据。

 

然后我有这样一句查询语句:

Java代码   收藏代码
  1. String hql = "FROM Login login WHERE login.id in(:ids)";  
  2. Map<String,Object> map = new HashMap<String,Object>();  
  3. Integer[] ids = new Integer[]{1,2,3};  
  4. map.put("ids",ids);  
  5. List<Login> lstLogin = (List<Login>)xxxDao.findByHql(hql,map,0,0);  

最后运行的时候,发生异常:ljava.lang.Integer cannot be cast to java.lang.Integer

也就是说hibernate把ids这个参数当做一个Integer对象了而不是一个集合。

后来在网上找了下答案,原来对hibernate中setParameter这个方法还不熟悉:Query接口提供了多种传递参数的方法,可以是传单独参数,也可以传集合,如下图

也就是说,前面使用数组集合的话则必须调用setParameterList方法。

那么改一下Dao层的setParameter方法即可达到通用了:

Java代码   收藏代码
  1. private Query setParameter(Query query, Map<String, Object> map) {  
  2.         if (map != null) {  
  3.             Set<String> keySet = map.keySet();  
  4.             for (String string : keySet) {  
  5.                 Object obj = map.get(string);  
  6.                 //这里考虑传入的参数是什么类型,不同类型使用的方法不同  
  7.                 if(obj instanceof Collection<?>){  
  8.                     query.setParameterList(string, (Collection<?>)obj);  
  9.                 }else if(obj instanceof Object[]){  
  10.                     query.setParameterList(string, (Object[])obj);  
  11.                 }else{  
  12.                     query.setParameter(string, obj);  
  13.                 }  
  14.             }  
  15.         }  
  16.         return query;  
  17.     }  

 

最初还以为是hibernate不够智能化,原来是自己没学好,项目经验相当重要呀...

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值