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

系统 3629 0

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

 

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

    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;
}
  

 

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

 

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

    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);
  

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

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

后来在网上找了下答案,原来对hibernate中setParameter这个方法还不熟悉: Query接口提供了多种传递参数的方法,可以是传单独参数,也可以传集合,如下图
[Hibernate框架]Hql语句in中带参数的写法
也就是说,前面使用数组集合的话则必须调用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);
				//这里考虑传入的参数是什么类型,不同类型使用的方法不同
				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不够智能化,原来是自己没学好,项目经验相当重要呀...

 

 

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


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论