最近遇到兩次在hql的in中傳遞參數(shù)的問題,最初讓我糾結(jié)萬千。
?
在dao層已經(jīng)封裝好了一個使用hql獲取數(shù)據(jù)的方法:
public List<?> findByHql(String hql, Map<String, Object> map, int pageSize,int pageNo) { return this.getQuery(hql, map, pageSize, pageNo).list(); } private Query getQuery(String hql, Map<String, Object> map, int pageSize,int pageNo) { Query query = this.createQuery(hql); query = this.setParameter(query, map); query = this.setPageProperty(query, pageSize, pageNo); return query; } private Query createQuery(String hql) { return getSession().createQuery(hql); } private Query setParameter(Query query, Map<String, Object> map) { if (map != null) { Set<String> keySet = map.keySet(); for (String string : keySet) { Object obj = map.get(string); query.setParameter(string, map.get(string)); } } return query; } private Query setPageProperty(Query query, int pageSize, int pageNo) { if (pageNo != 0 && pageSize != 0) { query.setFirstResult((pageNo - 1) * pageSize); query.setMaxResults(pageSize); } return query; }
?
通常在業(yè)務層只需要寫相應的hql,然后把對應參數(shù)封裝到map中,即可查詢出自己需要的數(shù)據(jù)。
?
然后我有這樣一句查詢語句:
String hql = "FROM Login login WHERE login.id in(:ids)"; Map<String,Object> map = new HashMap<String,Object>(); Integer[] ids = new Integer[]{1,2,3}; map.put("ids",ids); List<Login> lstLogin = (List<Login>)xxxDao.findByHql(hql,map,0,0);
最后運行的時候,發(fā)生異常:ljava.lang.Integer cannot be cast to java.lang.Integer
也就是說hibernate把ids這個參數(shù)當做一個Integer對象了而不是一個集合。
后來在網(wǎng)上找了下答案,原來對hibernate中setParameter這個方法還不熟悉:
Query接口提供了多種傳遞參數(shù)的方法,可以是傳單獨參數(shù),也可以傳集合,如下圖
也就是說,前面使用數(shù)組集合的話則必須調(diào)用setParameterList方法。
那么改一下Dao層的setParameter方法即可達到通用了:
private Query setParameter(Query query, Map<String, Object> map) { if (map != null) { Set<String> keySet = map.keySet(); for (String string : keySet) { Object obj = map.get(string); //這里考慮傳入的參數(shù)是什么類型,不同類型使用的方法不同 if(obj instanceof Collection<?>){ query.setParameterList(string, (Collection<?>)obj); }else if(obj instanceof Object[]){ query.setParameterList(string, (Object[])obj); }else{ query.setParameter(string, obj); } } } return query; }
?
最初還以為是hibernate不夠智能化,原來是自己沒學好,項目經(jīng)驗相當重要呀...
?
?
更多文章、技術(shù)交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
