转自:
http://xunbingjin.iteye.com/blog/616974
2009-4-25 8:12:34 org.apache.catalina.core.ApplicationContext log
信息: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.miracle.dm.doc.catalog.model.DocCatalogInfo
原来的查询语句:
String sql = "select a.* from tb_doc_catalog a where a.cat_code like '"+catCode+"%'";
Session session = this.getSession();
try {
List catNameList = session.createSQLQuery(sql).list();
return catNameList ;
} finally {
releaseSession(session); //释放session
}
分析:原来是查询出来的字段并不能自动转换为bean对象。
解决思路一(采用hql查询):
String sql = "select a from DocCatalogInfo a where a.catCode like '"+catCode+"%'";
List catNameList =getHibernateTemplate().find(sql);
return catNameList ;
ok,测试一下发现没问题,看来还是因为用原生sql查询的原因,网上搜一下:createsqlQuery返回对象,看到一篇文章才觉悟到:
解决思路二(采用原生sql查询):
String sql = "select a.* from tb_doc_catalog a where a.cat_code like '"+catCode+"%'";
Session session = this.getSession();
try {
List catNameList = session.createSQLQuery(sql).addEntity(DocCatalogInfo.class).list();
return catNameList ;
} finally {
releaseSession(session); //释放session
}
又ok了。
该篇文章也贴上来:
hibernate 中createQuery与createSQLQuery两者区别是:
前者用的hql语句进行查询,后者可以用sql语句查询
前者以hibernate生成的Bean为对象装入list返回
后者则是以对象数组进行存储
所以使用createSQLQuery有时候也想以hibernate生成的Bean为对象装入list返回,就不是很方便
突然发现createSQLQuery有这样一个方法可以直接转换对象
Query query = session.createSQLQuery(sql).addEntity(XXXXXXX.class);
XXXXXXX 代表以hibernate生成的Bean的对象,也就是数据表映射出的Bean。
呵呵以后多注意,还是时不时的要看看hibernate各个对象方法的使用。
还有另外一个相关的小细节应注意:
比如有这样一个po
PO: User.class
properties: userId,userName
DDL: create table tuser (userid varchar(10),username varchar(20));
当执行:
session.createQuery("from User u").list()时生成的SQL:
select userid,username from tuser;
当执行:
session.createQuery("from User u").iterator()时生成的SQL:
select userid from tuser;
可以看出list()一次将数据从数据库中读出直接填充到List中
iterator()将数据的主键从数据库中读出,当循环这个Iterator时才添加执行:
select userid,username from user where userid=?;把数据读出。
在不同的应用范围使用不同的方法,具体在hibernate应用中应当注意。
分享到:
相关推荐
Hibernate 中的 createQuery 和 createSqlQuery 区别详解 在 Hibernate 中,createQuery 和 createSqlQuery 是两个常用的查询方法,但是它们之间存在着一些关键的区别。了解这两个方法的差异对于正确地使用 ...
使用 addJoin 方法可以加载关联的实体和集合,例如: ```java List cats = sess.createSQLQuery("select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id") .addEntity("cat", Cat....
在使用Hibernate进行数据查询时,我们常常会遇到两种方式来构造查询:`createQuery`和`createSQLQuery`。这两种方法都是Hibernate提供的,但它们在功能和使用上有所不同。 `createQuery`是基于Hibernate Query ...
本文详细介绍了 Hibernate 提供的各种查询方式,包括 `load`、`get`、`createQuery` 和 `find` 等方法,并重点阐述了 HQL 查询的基本用法和高级技巧。通过本文的学习,读者可以掌握 Hibernate 的基本查询操作,并能...
在本节中,我们将详细介绍 Hibernate 的查询机制和优化策略,包括 HQL、QBC 和 SQL 查询的使用和优化。 一、HQL 查询 HQL(Hibernate Query Language,Hibernate 查询语言)是 Hibernate 提供的一种查询语言,它...
这通常通过 `session.createSQLQuery()` 来完成,但需要注意结果映射到 Java 对象的处理。 除了以上方法,Hibernate 还提供了 Criteria API 和 Native SQL 查询等其他方式来实现数据操作。Criteria API 提供了一种...
Query query = session.createSQLQuery("SELECT {c.*} FROM customers c WHERE c.name LIKE :customerName AND c.age = :customerAge"); query.setString("customerName", "tom"); query.setInteger("customerAge...
使用`createQuery()`或`createSQLQuery()`创建Query对象后,可以调用`setFirstResult()`设置起始索引,`setMaxResults()`设置每页的最大数量来实现分页。例如: ```java Session session = sessionFactory....
在Hibernate中,可以通过Session接口的createQuery或createSQLQuery方法结合setParameter来实现分页。具体步骤如下: - 使用createQuery或createSQLQuery创建查询。 - 调用setFirstResult设置起始位置。 - 调用...
Query 对象可以通过 Session 对象的 createSQLQuery() 或 createQuery() 方法创建,例如: ```java Session session = sf.openSession(); Query query = session.createSQLQuery("select * from Tree t where pid in...
Hibernate 查询语言 HQL(Hibernate Query Language)是Hibernate框架提供的一种面向对象的查询语言,它是对SQL的封装,使得开发者可以使用面向对象的方式来处理数据库查询,避免了直接操作SQL带来的复杂性和对象与...
Hibernate分页查询基于SQL的LIMIT和OFFSET子句,通过Session的createQuery或createSQLQuery方法创建查询,并设置FirstResult和MaxResults属性来实现分页。FirstResult表示从结果集的第几个元素开始获取,MaxResults...
在SessionFactory的帮助下,我们可以创建Session对象,然后调用它的createQuery或createSQLQuery方法来构造SQL查询语句。在SQL中,我们可以使用LIMIT和OFFSET子句来限制返回的记录数,OFFSET表示从哪一条记录开始,...
Hibernate也允许使用原生SQL查询,通过`createSQLQuery()`方法创建`SQLQuery`对象,然后可以使用`addEntity()`或`setResultTransformer()`将结果转换为对象。 总的来说,Hibernate的查询语言提供了一套灵活且强大...
SQLQuery sqlQuery = session.createSQLQuery("SELECT * FROM your_table_name"); sqlQuery.addEntity(YourEntityName.class); List<YourEntityName> allData = sqlQuery.list(); transaction.commit(); ...
在实现过程中,需要注意的是,由于Hibernate主要设计用于处理对象,所以调用存储过程时需要使用`createSQLQuery`而不是`createQuery`。此外,存储过程的调用格式通常为`CALL procedure_name()`。 总结来说,这篇...
5. **查询(createQuery()、createSQLQuery()、find()等)**:Hibernate提供丰富的查询方式,如HQL(Hibernate Query Language)、 Criteria API 和原生SQL查询。createQuery()用于执行HQL,createSQLQuery()执行...
在Hibernate框架中,进行数据库操作时,开发者可以选择使用两种不同的查询语言:NSQL(Native SQL)和HQL(Hibernate Query Language)。这两种查询方式各有优势,在不同的场景下使用可以达到最佳的效果。 ##### 一...
4. **查询**:使用Session的createQuery或createSQLQuery方法创建HQL(Hibernate Query Language)或SQL查询,执行查询并获取结果集。例如,`List<User> users = session.createQuery("from User").list()`将返回...
然而,在处理大量数据时,如何有效地进行批量更新和批量删除操作,是每一个开发者都可能遇到的挑战。本文将深入探讨在Hibernate中处理批量更新和批量删除的策略,以及如何优化这些操作,以提高数据库操作的效率。 #...