`

createSQLQuery和createQuery

    博客分类:
  • J2EE
阅读更多

转自:

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 区别详解 在 Hibernate 中,createQuery 和 createSqlQuery 是两个常用的查询方法,但是它们之间存在着一些关键的区别。了解这两个方法的差异对于正确地使用 ...

    hibernate 的createSQLQuery的几种用法

    使用 addJoin 方法可以加载关联的实体和集合,例如: ```java List cats = sess.createSQLQuery("select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id") .addEntity("cat", Cat....

    ceateQuery ceateSQLQuery

    在使用Hibernate进行数据查询时,我们常常会遇到两种方式来构造查询:`createQuery`和`createSQLQuery`。这两种方法都是Hibernate提供的,但它们在功能和使用上有所不同。 `createQuery`是基于Hibernate Query ...

    Hibernate查询解决方案

    本文详细介绍了 Hibernate 提供的各种查询方式,包括 `load`、`get`、`createQuery` 和 `find` 等方法,并重点阐述了 HQL 查询的基本用法和高级技巧。通过本文的学习,读者可以掌握 Hibernate 的基本查询操作,并能...

    4.Hibernate-04查询以及优化策略1

    在本节中,我们将详细介绍 Hibernate 的查询机制和优化策略,包括 HQL、QBC 和 SQL 查询的使用和优化。 一、HQL 查询 HQL(Hibernate Query Language,Hibernate 查询语言)是 Hibernate 提供的一种查询语言,它...

    Hibernate实现记录的增、删、改和查功能

    这通常通过 `session.createSQLQuery()` 来完成,但需要注意结果映射到 Java 对象的处理。 除了以上方法,Hibernate 还提供了 Criteria API 和 Native SQL 查询等其他方式来实现数据操作。Criteria API 提供了一种...

    HQL经典语句

    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...

    Hibernate分页总结

    使用`createQuery()`或`createSQLQuery()`创建Query对象后,可以调用`setFirstResult()`设置起始索引,`setMaxResults()`设置每页的最大数量来实现分页。例如: ```java Session session = sessionFactory....

    SSH实现分页

    在Hibernate中,可以通过Session接口的createQuery或createSQLQuery方法结合setParameter来实现分页。具体步骤如下: - 使用createQuery或createSQLQuery创建查询。 - 调用setFirstResult设置起始位置。 - 调用...

    Query对象setResultTransFormer()

    Query 对象可以通过 Session 对象的 createSQLQuery() 或 createQuery() 方法创建,例如: ```java Session session = sf.openSession(); Query query = session.createSQLQuery("select * from Tree t where pid in...

    hibernate查询语言--HQL

    Hibernate 查询语言 HQL(Hibernate Query Language)是Hibernate框架提供的一种面向对象的查询语言,它是对SQL的封装,使得开发者可以使用面向对象的方式来处理数据库查询,避免了直接操作SQL带来的复杂性和对象与...

    hibernate分页查询

    Hibernate分页查询基于SQL的LIMIT和OFFSET子句,通过Session的createQuery或createSQLQuery方法创建查询,并设置FirstResult和MaxResults属性来实现分页。FirstResult表示从结果集的第几个元素开始获取,MaxResults...

    Struts + Hibernate 实现简单分页功能

    在SessionFactory的帮助下,我们可以创建Session对象,然后调用它的createQuery或createSQLQuery方法来构造SQL查询语句。在SQL中,我们可以使用LIMIT和OFFSET子句来限制返回的记录数,OFFSET表示从哪一条记录开始,...

    Hibernate查询语言.doc

    Hibernate也允许使用原生SQL查询,通过`createSQLQuery()`方法创建`SQLQuery`对象,然后可以使用`addEntity()`或`setResultTransformer()`将结果转换为对象。 总的来说,Hibernate的查询语言提供了一套灵活且强大...

    Hibernate_Query查询所有数据

    SQLQuery sqlQuery = session.createSQLQuery("SELECT * FROM your_table_name"); sqlQuery.addEntity(YourEntityName.class); List<YourEntityName> allData = sqlQuery.list(); transaction.commit(); ...

    hibernate调用存储过程知识.pdf

    在实现过程中,需要注意的是,由于Hibernate主要设计用于处理对象,所以调用存储过程时需要使用`createSQLQuery`而不是`createQuery`。此外,存储过程的调用格式通常为`CALL procedure_name()`。 总结来说,这篇...

    实现自己的Hibernate框架之Session 方法实现

    5. **查询(createQuery()、createSQLQuery()、find()等)**:Hibernate提供丰富的查询方式,如HQL(Hibernate Query Language)、 Criteria API 和原生SQL查询。createQuery()用于执行HQL,createSQLQuery()执行...

    Hibernate_NSQL&HQL增删改操作

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

    hibernate实现增删改查

    4. **查询**:使用Session的createQuery或createSQLQuery方法创建HQL(Hibernate Query Language)或SQL查询,执行查询并获取结果集。例如,`List<User> users = session.createQuery("from User").list()`将返回...

    在Hibernate中处理批量更新和批量删除

    然而,在处理大量数据时,如何有效地进行批量更新和批量删除操作,是每一个开发者都可能遇到的挑战。本文将深入探讨在Hibernate中处理批量更新和批量删除的策略,以及如何优化这些操作,以提高数据库操作的效率。 #...

Global site tag (gtag.js) - Google Analytics