最近遇到两次在hql的in中传递参数的问题,最初让我纠结万千。
在dao层已经封装好了一个使用hql获取数据的方法:
Java代码 收藏代码
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中,即可查询出自己需要的数据。
然后我有这样一句查询语句:
Java代码 收藏代码
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方法即可达到通用了:
Java代码 收藏代码
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不够智能化,原来是自己没学好,项目经验相当重要呀...
在dao层已经封装好了一个使用hql获取数据的方法:
Java代码 收藏代码
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中,即可查询出自己需要的数据。
然后我有这样一句查询语句:
Java代码 收藏代码
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方法即可达到通用了:
Java代码 收藏代码
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不够智能化,原来是自己没学好,项目经验相当重要呀...
发表评论
-
No result defined for action and result input
2014-11-04 00:00 722No result defined for action an ... -
oracle常用函数
2014-09-25 13:52 625oracle常用函数 1.decode(value,if 1 ... -
java 对象之间属性值复制
2014-09-15 13:42 17171, BeanUtils.copyProperties(des ... -
XStream解析下划线出现重复问题
2014-07-17 17:15 1577直接看代码 XStream xs = new XStrea ... -
在eclipse中svn账户或密码错误或想更改用户
2014-04-21 16:26 859删除c:\User\当前登录名\AppData\Roaming ... -
spring3集成quartz2
2014-04-19 14:34 985最近项目中要用到quartz 做job,在网上看了些资料,自己 ... -
oracle与mysql多行合并
2014-04-14 14:59 8271.oracle多行合并一行 效果: SELECT a, ... -
jasperreport报表问题
2014-04-04 17:14 1272今天改报表遇到个问题,从svn拉了个报表下来直接改,改后编译放 ... -
如何防止用户重复提交
2013-08-26 18:43 1198防止重复提交java解决 ... -
java.lang.IllegalStateException: getOutputStream() has already been called for t
2013-06-04 21:42 1105最近查看apache tomcat日志,发现经常出现一个错误如 ... -
简单的Excel导出
2013-05-28 23:02 1016项目报表要做导出Excel的功能,用了POI,首先要加载POI ... -
sql
2013-04-01 17:20 676sql从一张表的数据更新到另一张表 UPDATE 表B S ... -
javascript获取当前行
2013-01-10 14:53 1391这些天用到了,记下来,说不定将来有用 var td=even ... -
严格的身份证号码验证
2012-12-27 15:26 981<script> function chec ... -
游标的使用
2012-12-06 21:00 915create or replace procedure ... -
存储过程
2012-12-06 19:41 879存储过程 1 CREATE OR REPLACE PRO ... -
oracle创建存储过程和函数
2012-12-06 19:07 1013Oracle创建存储过程、创建函数、创建包 一、Oracle ... -
关于oracle 中的jobs
2012-12-06 15:18 1180先给个小例子吧 create ... -
javascript操作时间总结
2012-11-22 19:57 868时间对象是一个我们经常要用到的对象,无论是做时间输出、时间判断 ... -
tomcat启动时报异常java.lang.Exception: Socket bind failed
2012-11-07 10:57 1582异常如下: 严重: Error starting endpoi ...
相关推荐
Hibernate框架中,在使用HQL语句时,需要传递参数,而在HQL语句中使用in关键字时,需要特别注意参数的传递方式。在本文中,我们将讨论如何在HQL语句中使用in关键字带参数的写法,以及解决相关问题的方法。 一、HQL...
若要查询id在特定集合中的用户,可以使用`IN`操作符,如`FROM User where id IN (:ids)`,并使用`.setParameterList("ids", new Object[]{1,3,4})`传递数组。 9. **使用命名查询**: 命名查询将HQL语句写在`.hbm....
1. **在Hql中使用`group by`的问题** - **统计函数与分组**:在Hql中,`group by`语句用于对数据进行分组,常与聚合函数如`sum()`、`count()`、`max()`等结合使用。例如,你可以选择特定字段进行分组,并计算每个组...
在实际应用开发中,HQL被广泛用于数据检索、更新等操作。下面将详细介绍HQL语言中的一些常用的方法及其应用场景。 #### 1. find 方法 `find` 方法是HQL中最基本也是最常用的查询方法之一,通过它可以执行简单的...
HQL语句 HQL语句 HQL语句 HQL语句 HQL语句
在HQL中,可以通过集合参数传递多个值。例如,如果你有一个`List<Integer> ids`,可以这样查询: ```java String hql = "from EntityName e where e.id in (:ids)"; Query query = session.createQuery(hql); query...
Hql PPt Hql PPt
不喜欢使用myEclipse的...最近在项目中使用Hibernate,由于需要使用HQL,找了很多资料,大都是MyEclipse中自带的HQL工具。 由于MyEclipse是收费的,速度不是很理想。所以在网上找到了一个elipse插件 英文图文教程 ...
4. **设置参数**:如果HQL语句中含有参数,则需要通过Query对象的`setXxx`方法为这些参数赋值。 5. **执行查询并遍历结果**:最后调用Query对象的`list`方法或其他相关方法来执行查询并遍历查询结果。 #### 三、HQL...
4. **设置参数**: 如果HQL中有参数,可以通过`setXxx`方法(如`setString`, `setDate`等)为参数赋值。 5. **执行查询**: 调用Query对象的`list`方法执行查询,获取查询结果列表。 6. **遍历结果**: 使用迭代器...
本文档将详细介绍如何在Spring环境中运用HQL进行数据查询操作,包括基本查询、参数绑定以及命名查询等高级特性。 #### 一、基本查询方法 在Spring框架中,`HibernateTemplate`类提供了多种方法来执行HQL查询,这些...
1、掌握Hibernate框架应用项目 2、学习HQL参数查询和Criteria查询 3、比较HQL和Criteria的不同 建立web项目,通过页面查询构造动态查询语句,struts2和hibernate框架整合。
Hibernate HQL,全称为Hibernate Query Language,是Hibernate框架中用于操作对象关系映射(ORM)的查询语言。...在使用时,需要注意避免SQL注入等安全问题,并合理利用分页和命名参数来优化查询性能。
在Java开发中,尤其是涉及到持久化操作时,Hibernate Query Language(HQL)是不可或缺的一部分。HQL是一种面向对象的查询语言,专为Hibernate框架设计,它允许开发者以类和属性而不是数据库表和列来编写查询。这篇...
可以通过数组传递多个参数值到HQL语句中。 **示例代码**: ```java String hql = "from bean.User u where u.name=? and u.password=?"; List<User> userList = this.getHibernateTemplate().find(hql, new String...
在这个例子中,`Customer`和`Order`之间存在一对多关系,`JOIN`关键字用于连接这两个实体,`o.status = 'paid'`则是对关联对象的条件筛选。 ### 子查询 HQL也支持子查询,可以嵌套在`SELECT`, `FROM`, `WHERE`等...
在Java的持久化框架Hibernate中,HQL(Hibernate Query Language)是用于操作对象关系映射(ORM)的SQL方言,提供了更加面向对象的查询方式。本篇将详细讲解HQL中的命名参数以及如何通过Query接口实现分页查询,这...
- `select new ClassTest(p.name, p.address) from Person as p`:实例化`ClassTest`类并传递`name`和`address`作为参数。 - `select p.name as personName from Person as p`:使用别名`personName`显示`name`属性...
当需要同时查询多个字段时,可以在HQL语句中指定这些字段,并通过索引来访问这些字段值: ```java String hql = "select u.name, u.age from com.mypack.User4 u"; Query query = session.createQuery(hql); List ...