最近遇到两次在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
分享到:
相关推荐
Hibernate框架Hql语句in中带参数的写法 Hibernate框架中,在使用HQL语句时,需要传递参数,而在HQL语句中使用in关键字时,需要特别注意参数的传递方式。在本文中,我们将讨论如何在HQL语句中使用in关键字带参数的...
"Hibernate-HQL语句多对多写法" Hibernate 是一个流行的 Java 持久层框架,它提供了强大的对象关系映射(ORM)功能,使得开发者可以方便地与数据库交互。但是,在使用 Hibernate 时,我们经常会遇到多对多关系的...
这个简单的HQL语句用于查询`DesignActivity`表中的所有记录。这里的`DesignActivity`应该是指代一个实体类名,该类映射到名为`DesignActivity`的数据表。此查询返回所有`DesignActivity`实体的列表。 #### 2. 查询...
- 封装:DAO类应封装具体的SQL查询和HQL(Hibernate Query Language)语句,避免在业务层暴露这些细节。 - 单一职责:每个DAO类应只负责一种类型的数据操作,如用户DAO只处理用户相关的操作。 - 可复用:设计通用的...
在Hibernate框架中,进行数据库操作时,开发者可以选择使用两种不同的查询语言:NSQL(Native SQL)和HQL(Hibernate Query Language)。这两种查询方式各有优势,在不同的场景下使用可以达到最佳的效果。 ##### 一...
HQL(Hibernate Query Language)是 Hibernate 框架中的一种强大的查询语言,它类似于 SQL 语句,但是它是完全面向对象的查询语言,可以理解继承、多态和关联等概念。 大小写敏感性问题 在 HQL 中,除了 Java 类与...
HQL(Hibernate Query Language)是 Hibernate 中的一种强大的查询语言,它看起来很像 SQL,但是不要被语法结构上的相似所迷惑,HQL 是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态和关联之类的...
### HQL语句大全知识点详解 #### 一、HQL简介 HQL(Hibernate Query Language)是一种面向对象的查询语言,由Hibernate框架提供。虽然它的语法结构与SQL类似,但HQL是专为面向对象查询设计的,能够很好地处理继承、...
本篇将深入讲解在Hibernate中常用的查询语句,包括HQL(Hibernate Query Language)和QBC(Query By Criteria)两种方式。 1. HQL(Hibernate Query Language)是面向对象的查询语言,它允许开发者以类和属性的名字...
在配置文件中,还可以添加连接池参数,如`hibernate.c3p0.*`,来优化数据库连接管理。例如: ```xml <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider ...
通过以上步骤,我们可以成功地在Myeclipse环境中搭建基于Hibernate3的数据库操作框架,并实现了基本的CRUD操作及多表联查等功能。这不仅有助于提高开发效率,还能够让应用程序更好地利用数据库资源。
2.4 HQL语句(简要介绍) HQL是Hibernate特有的查询语言,类似SQL,但操作的是对象而非表,支持更丰富的查询功能,如关联查询、分页、排序等。 三、数据映射类型 3.1 映射类型的作用 映射类型用于将Java对象的属性...
在本篇“2023年Java相关课程系列笔记之十四Hibernate学习笔记”中,我们将深入探讨Java开发中常用的持久化框架——Hibernate。这个框架由梁建全老师主讲,旨在帮助开发者更高效、便捷地进行数据库操作,弥补JDBC在...
2.4 HQL语句(简要介绍) HQL是Hibernate的查询语言,类似SQL,但操作对象是Java对象,支持条件、聚合、分组等高级查询。 **三、数据映射类型** 3.1 映射类型的作用 映射类型定义了Java对象的属性如何与数据库字段...
Hibernate框架是一个对象关系映射(ORM)工具,它允许开发者使用面向对象的方式操作数据库,减少了手动编写SQL语句的工作量。Hibernate支持多种数据库,具备强大的查询功能,包括HQL(Hibernate Query Language)和...
根据提供的文件内容,我们可以将知识点归类为Java基础、J2EE技术栈、Struts2框架、Hibernate ORM、Spring框架、Web基础以及数据库技术。 Java基础: - package关键字用于定义Java包,以解决同名类的冲突,有命名...
然而,Hibernate的HQL(Hibernate Query Language)或Criteria API并不直接支持复杂的子查询或联接查询,特别是涉及到多表联合查询的复杂子查询,如在示例中所示。 在给出的日志中,可以看到一个嵌套的子查询,尝试...
【Hibernate 框架详解与应用实践】 Hibernate 是一个开源的对象关系映射(ORM)框架,它极大地简化了 Java 应用程序与数据库之间的交互。通过 Hibernate,开发者可以使用面向对象的方式来操作数据库,无需编写大量...
开发过程中参照了Hibernate Shards、Alibaba TDDL、Cobar等框架,也是基于词法分析器来提取SQL参数,并计算路由。 能支持分库维度含糊等场景下的分库分表。以及包括多库多表下的 order by , distinct, group by, ...