`

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

阅读更多

最近遇到两次在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接口提供了多种传递参数的方法,可以是传单独参数,也可以传集合,如下图

也就是说,前面使用数组集合的话则必须调用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不够智能化,原来是自己没学好,项目经验相当重要呀...

 

 

  • 大小: 39.1 KB
3
0
分享到:
评论
3 楼 www314599782 2016-04-28  
setParameterList 的集合是空 怎么处理  in ()
2 楼 tianshui0823 2015-03-10  
昨天犯了同样的错无,纠结了好长时间,最后使用了笨方法,对in的最特殊处理,直接拼接字符串;原来是对hibernate中的 setParameter和setParameterList无知了
1 楼 倔强的土豆 2013-06-14  
,同样错误的飘过

相关推荐

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

    Hibernate框架Hql语句in中带参数的写法 Hibernate框架中,在使用HQL语句时,需要传递参数,而在HQL语句中使用in关键字时,需要特别注意参数的传递方式。在本文中,我们将讨论如何在HQL语句中使用in关键字带参数的...

    Hibernate-HQL语句多对多写法

    "Hibernate-HQL语句多对多写法" Hibernate 是一个流行的 Java 持久层框架,它提供了强大的对象关系映射(ORM)功能,使得开发者可以方便地与数据库交互。但是,在使用 Hibernate 时,我们经常会遇到多对多关系的...

    HQL的几钟常见写法

    这个简单的HQL语句用于查询`DesignActivity`表中的所有记录。这里的`DesignActivity`应该是指代一个实体类名,该类映射到名为`DesignActivity`的数据表。此查询返回所有`DesignActivity`实体的列表。 #### 2. 查询...

    HibernateDAO的写法

    - 封装:DAO类应封装具体的SQL查询和HQL(Hibernate Query Language)语句,避免在业务层暴露这些细节。 - 单一职责:每个DAO类应只负责一种类型的数据操作,如用户DAO只处理用户相关的操作。 - 可复用:设计通用的...

    Hibernate_NSQL&HQL增删改操作

    在Hibernate框架中,进行数据库操作时,开发者可以选择使用两种不同的查询语言:NSQL(Native SQL)和HQL(Hibernate Query Language)。这两种查询方式各有优势,在不同的场景下使用可以达到最佳的效果。 ##### 一...

    Hibernate查询语言(HQL) 语法参考

    HQL(Hibernate Query Language)是 Hibernate 框架中的一种强大的查询语言,它类似于 SQL 语句,但是它是完全面向对象的查询语言,可以理解继承、多态和关联等概念。 大小写敏感性问题 在 HQL 中,除了 Java 类与...

    HQL Hibernate查询语言

    HQL(Hibernate Query Language)是 Hibernate 中的一种强大的查询语言,它看起来很像 SQL,但是不要被语法结构上的相似所迷惑,HQL 是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态和关联之类的...

    HQL语句大全

    ### HQL语句大全知识点详解 #### 一、HQL简介 HQL(Hibernate Query Language)是一种面向对象的查询语言,由Hibernate框架提供。虽然它的语法结构与SQL类似,但HQL是专为面向对象查询设计的,能够很好地处理继承、...

    hibernate常用语句

    本篇将深入讲解在Hibernate中常用的查询语句,包括HQL(Hibernate Query Language)和QBC(Query By Criteria)两种方式。 1. HQL(Hibernate Query Language)是面向对象的查询语言,它允许开发者以类和属性的名字...

    hibernate配置文件以及类映射文件常用写法1

    在配置文件中,还可以添加连接池参数,如`hibernate.c3p0.*`,来优化数据库连接管理。例如: ```xml &lt;property name="hibernate.connection.provider_class"&gt;org.hibernate.connection.C3P0ConnectionProvider ...

    Hibernate3教程

    通过以上步骤,我们可以成功地在Myeclipse环境中搭建基于Hibernate3的数据库操作框架,并实现了基本的CRUD操作及多表联查等功能。这不仅有助于提高开发效率,还能够让应用程序更好地利用数据库资源。

    Java相关课程系列笔记之十四Hibernate学习笔记

    2.4 HQL语句(简要介绍) HQL是Hibernate特有的查询语言,类似SQL,但操作的是对象而非表,支持更丰富的查询功能,如关联查询、分页、排序等。 三、数据映射类型 3.1 映射类型的作用 映射类型用于将Java对象的属性...

    2023年Java相关课程系列笔记之十四Hibernate学习笔记.doc

    在本篇“2023年Java相关课程系列笔记之十四Hibernate学习笔记”中,我们将深入探讨Java开发中常用的持久化框架——Hibernate。这个框架由梁建全老师主讲,旨在帮助开发者更高效、便捷地进行数据库操作,弥补JDBC在...

    Java相关课程系列笔记之十四Hibernate学习笔记.doc

    2.4 HQL语句(简要介绍) HQL是Hibernate的查询语言,类似SQL,但操作对象是Java对象,支持条件、聚合、分组等高级查询。 **三、数据映射类型** 3.1 映射类型的作用 映射类型定义了Java对象的属性如何与数据库字段...

    中英文简历的写法,想写好简历就下吧。

    Hibernate框架是一个对象关系映射(ORM)工具,它允许开发者使用面向对象的方式操作数据库,减少了手动编写SQL语句的工作量。Hibernate支持多种数据库,具备强大的查询功能,包括HQL(Hibernate Query Language)和...

    J2EE框架考试试题借鉴.pdf

    根据提供的文件内容,我们可以将知识点归类为Java基础、J2EE技术栈、Struts2框架、Hibernate ORM、Spring框架、Web基础以及数据库技术。 Java基础: - package关键字用于定义Java包,以解决同名类的冲突,有命名...

    hibernate映射配置文件不支持union联合查询[参照].pdf

    然而,Hibernate的HQL(Hibernate Query Language)或Criteria API并不直接支持复杂的子查询或联接查询,特别是涉及到多表联合查询的复杂子查询,如在示例中所示。 在给出的日志中,可以看到一个嵌套的子查询,尝试...

    Hibbernate应用练习

    【Hibernate 框架详解与应用实践】 Hibernate 是一个开源的对象关系映射(ORM)框架,它极大地简化了 Java 应用程序与数据库之间的交互。通过 Hibernate,开发者可以使用面向对象的方式来操作数据库,无需编写大量...

    支持多数据库的ORM框架ef-orm.zip

    开发过程中参照了Hibernate Shards、Alibaba TDDL、Cobar等框架,也是基于词法分析器来提取SQL参数,并计算路由。 能支持分库维度含糊等场景下的分库分表。以及包括多库多表下的 order by , distinct, group by, ...

Global site tag (gtag.js) - Google Analytics