`

最近遇到两次在hql的in中传递参数的问题

阅读更多
最近遇到两次在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不够智能化,原来是自己没学好,项目经验相当重要呀...

分享到:
评论

相关推荐

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

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

    Hibernate HQL详解.docx

    若要查询id在特定集合中的用户,可以使用`IN`操作符,如`FROM User where id IN (:ids)`,并使用`.setParameterList("ids", new Object[]{1,3,4})`传递数组。 9. **使用命名查询**: 命名查询将HQL语句写在`.hbm....

    Hql语句注意事项总结

    1. **在Hql中使用`group by`的问题** - **统计函数与分组**:在Hql中,`group by`语句用于对数据进行分组,常与聚合函数如`sum()`、`count()`、`max()`等结合使用。例如,你可以选择特定字段进行分组,并计算每个组...

    hql语言中的一些常用的方法

    在实际应用开发中,HQL被广泛用于数据检索、更新等操作。下面将详细介绍HQL语言中的一些常用的方法及其应用场景。 #### 1. find 方法 `find` 方法是HQL中最基本也是最常用的查询方法之一,通过它可以执行简单的...

    HQL语句 HQL语句

    HQL语句 HQL语句 HQL语句 HQL语句 HQL语句

    hql基础语句

    在HQL中,可以通过集合参数传递多个值。例如,如果你有一个`List&lt;Integer&gt; ids`,可以这样查询: ```java String hql = "from EntityName e where e.id in (:ids)"; Query query = session.createQuery(hql); query...

    hql ppt Hql PPt

    Hql PPt Hql PPt

    HQL Eclipse Plugins 配置教程

    不喜欢使用myEclipse的...最近在项目中使用Hibernate,由于需要使用HQL,找了很多资料,大都是MyEclipse中自带的HQL工具。 由于MyEclipse是收费的,速度不是很理想。所以在网上找到了一个elipse插件 英文图文教程 ...

    HQL语法大全,并带有详细的例子

    4. **设置参数**:如果HQL语句中含有参数,则需要通过Query对象的`setXxx`方法为这些参数赋值。 5. **执行查询并遍历结果**:最后调用Query对象的`list`方法或其他相关方法来执行查询并遍历查询结果。 #### 三、HQL...

    HQL语法入门学习HQL语法入门学习

    4. **设置参数**: 如果HQL中有参数,可以通过`setXxx`方法(如`setString`, `setDate`等)为参数赋值。 5. **执行查询**: 调用Query对象的`list`方法执行查询,获取查询结果列表。 6. **遍历结果**: 使用迭代器...

    Spring中hql语句的常用方法

    本文档将详细介绍如何在Spring环境中运用HQL进行数据查询操作,包括基本查询、参数绑定以及命名查询等高级特性。 #### 一、基本查询方法 在Spring框架中,`HibernateTemplate`类提供了多种方法来执行HQL查询,这些...

    HQL参数查询和Criteria查询

    1、掌握Hibernate框架应用项目 2、学习HQL参数查询和Criteria查询 3、比较HQL和Criteria的不同 建立web项目,通过页面查询构造动态查询语句,struts2和hibernate框架整合。

    hibernate-hql 资料大全

    Hibernate HQL,全称为Hibernate Query Language,是Hibernate框架中用于操作对象关系映射(ORM)的查询语言。...在使用时,需要注意避免SQL注入等安全问题,并合理利用分页和命名参数来优化查询性能。

    强烈建议的HQL语法规则详解

    在Java开发中,尤其是涉及到持久化操作时,Hibernate Query Language(HQL)是不可或缺的一部分。HQL是一种面向对象的查询语言,专为Hibernate框架设计,它允许开发者以类和属性而不是数据库表和列来编写查询。这篇...

    Spring中常用的hql查询方法

    可以通过数组传递多个参数值到HQL语句中。 **示例代码**: ```java String hql = "from bean.User u where u.name=? and u.password=?"; List&lt;User&gt; userList = this.getHibernateTemplate().find(hql, new String...

    HQL详解

    在这个例子中,`Customer`和`Order`之间存在一对多关系,`JOIN`关键字用于连接这两个实体,`o.status = 'paid'`则是对关联对象的条件筛选。 ### 子查询 HQL也支持子查询,可以嵌套在`SELECT`, `FROM`, `WHERE`等...

    Hibernate HQL命名参数和Query接口的分页

    在Java的持久化框架Hibernate中,HQL(Hibernate Query Language)是用于操作对象关系映射(ORM)的SQL方言,提供了更加面向对象的查询方式。本篇将详细讲解HQL中的命名参数以及如何通过Query接口实现分页查询,这...

    全面解析HQL语句 非常详细直接的HQL语句的功能介绍

    - `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语句 使用大全

    当需要同时查询多个字段时,可以在HQL语句中指定这些字段,并通过索引来访问这些字段值: ```java String hql = "select u.name, u.age from com.mypack.User4 u"; Query query = session.createQuery(hql); List ...

Global site tag (gtag.js) - Google Analytics