`
flashdream8
  • 浏览: 675513 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate 中createQuery与createSQLQuery

阅读更多

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应用中应当注意。

 

 

---------------------------------------------------------------------------------------------------------------------------------

 

 

两个表(实体), 1对多双向关联:

班级: Clazz (id, name)

学生: Student(id, name , class_id)

1. 查询持久化对象  
1.1 简单查询,返回数据库结构
view plaincopy to clipboardprint?
sql = "select c.* from clazz c,student s where s.class_id = c.id";      
  
List<Clazz> clazzs = (List<Clazz>)session.createSQLQuery(sql).list(); 
 sql = "select c.* from clazz c,student s where s.class_id = c.id"; List<Clazz> clazzs = (List<Clazz>)session.createSQLQuery(sql).list();特别注意:返回结果是Object[]组成的List,通过Object下标访问属性

使用场合:非基于对象的查询,复杂查询

1.2 简单查询,返回持久化对象
  sql = "select c.* from Clazz c , student s where s.class_id = c.id ";    List<Clazz> clazzs = (List<Clazz>) session.createSQLQuery(sql).addEntity(Clazz.class).list();

特别注意: 1.addEntity方法指定返回包含Clazz对象的List 2. 查询出来的持久态对象,clazz对象的studets属性是各代理对象,访问的时候才会去查询DB 使用场合:基于对象的查询,但对象简单查询

1.3 多表查询,返回多个实体
view plaincopy to clipboardprint?
String sql = "select {c.*}, {s.*} from Clazz c , student s where s.class_id = c.id   ";   
  
List<Clazz> clazzs = (List<Clazz>) session().createSQLQuery(sql)   
  
                                 .addEntity("c", Clazz.class)   
  
                                 .addEntity("s", Student.class).list(); 
String sql = "select {c.*}, {s.*} from Clazz c , student s where s.class_id = c.id "; List<Clazz> clazzs = (List<Clazz>) session().createSQLQuery(sql) .addEntity("c", Clazz.class) .addEntity("s", Student.class).list();view plaincopy to clipboardprint?
特别注意:    
1. addEntity方法指定了当前返回实体的别名,而且在SQL语句里使用{c.*}这样的语句,   
它的意思是向别名为c的这个对象注入所有属性值. 
特别注意: 1. addEntity方法指定了当前返回实体的别名,而且在SQL语句里使用{c.*}这样的语句, 它的意思是向别名为c的这个对象注入所有属性值.view plaincopy to clipboardprint?
2. 这个查询会返回一个Object的List,每个Object包含两个对象一个Clazz,一个Student 
2. 这个查询会返回一个Object的List,每个Object包含两个对象一个Clazz,一个Studentview plaincopy to clipboardprint?
3. {}占位符里是对象的属性,而非列名,如{s.class},而非{s.class_id} 
3. {}占位符里是对象的属性,而非列名,如{s.class},而非{s.class_id}view plaincopy to clipboardprint?
4. 必须注入对象的每个属性值,你可以使用{c.*},或者手工写全所有,但必须是所有属性。(这个太让我郁闷了。  
4. 必须注入对象的每个属性值,你可以使用{c.*},或者手工写全所有,但必须是所有属性。(这个太让我郁闷了。 view plaincopy to clipboardprint?
使用场合:基于对象的查询,复杂查询 
使用场合:基于对象的查询,复杂查询1.4  多表查询,返回关联实体

view plaincopy to clipboardprint?
String sql = "select {c.*}, {s.*} from Clazz c , student s where s.class_id = c.id   ";   
  
List<Clazz> clazzs = (List<Clazz>) session().createSQLQuery(sql)   
  
        .addEntity("c", Clazz.class)   
  
        .addJoin("s", "c.students").list(); 
String sql = "select {c.*}, {s.*} from Clazz c , student s where s.class_id = c.id "; List<Clazz> clazzs = (List<Clazz>) session().createSQLQuery(sql) .addEntity("c", Clazz.class) .addJoin("s", "c.students").list();view plaincopy to clipboardprint?
<P>特别注意: 这块有些问题,明明应该返回Clazz的List的,但确返回包含Clazz和Student的Object的List, faint</P><P>使用场合:基于对象的查询,复杂查询</P> 
特别注意: 这块有些问题,明明应该返回Clazz的List的,但确返回包含Clazz和Student的Object的List, faint使用场合:基于对象的查询,复杂查询2. 查询托管对象

view plaincopy to clipboardprint?
String sql = "select c.id, c.name from Clazz c , student s where s.class_id = c.id   ";      
  
List<Clazz> clazzs = (List<Clazz>) session.createSQLQuery(sql)         
  
                                     .addScalar("id", Hibernate.LONG)  
  
                                     .addScalar("name", Hibernate.STRING)        
  
                                     .setResultTransformer(Transformers.aliasToBean(Clazz.class)).list();  String sql = "select c.id, c.name from Clazz c , student s where s.class_id = c.id "; List<Clazz> clazzs = (List<Clazz>) session.createSQLQuery(sql) .addScalar("id", Hibernate.LONG) .addScalar("name", Hibernate.STRING) .setResultTransformer(Transformers.aliasToBean(Clazz.class)).list(); 特别注意:

1. 如果不设置addScalar方法可能会报转型错误的异常.

2.托管查询可以使用投影,只查询指定的列属性

分享到:
评论

相关推荐

    关于hibernate 的createQuery和createSqlQuery 的区别

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

    hibernate 的createSQLQuery的几种用法

    Hibernate 的 createSQLQuery 是 Hibernate 框架中的一种强大且灵活的查询机制,它允许开发者使用原生 SQL 语句来查询数据库。下面是 createSQLQuery 的几种常见用法: 一、简单的 SQLQuery 在最简单的情况下,...

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

    在IT领域,尤其是在Java开发与数据库交互的过程中,Hibernate作为一个强大的对象关系映射(ORM)框架,为开发者提供了诸多便利。然而,在处理大量数据时,如何有效地进行批量更新和批量删除操作,是每一个开发者都...

    hibernate分页查询

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

    hibernate查询详细代码讲解

    在Hibernate中,我们可以通过Session对象的createQuery或createSQLQuery方法来执行HQL。例如: ```java Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); ...

    Struts + Hibernate 实现简单分页功能

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

    hibernate的HQL的jar

    4. **查询**:使用Session的createQuery或createSQLQuery方法创建HQL或SQL查询,然后设置参数并执行。 5. **结果处理**:HQL查询返回的结果可以是List对象,其中包含了查询结果对应的Java对象。 总的来说,...

    hibernate多表联合查询

    在Hibernate中,可以使用以下几种方式来实现多表联合查询: - **HQL (Hibernate Query Language)** - **Criteria API** - **Native SQL** 本文将重点介绍如何使用HQL和Native SQL来实现多表联合查询。 #### 三、...

    HibernateDemo(hibernate基本用法演示)

    - **读取(Read)**:通过 `get()` 或 `load()` 获取单个实体,`createQuery()` 或 `createSQLQuery()` 执行 HQL(Hibernate 查询语言)或 SQL 查询获取多个实体。 - **更新(Update)**:修改实体后调用 `update...

    hibernate的一个简单例程

    4. **查询(Query)**:通过Session的createQuery()或createSQLQuery()方法,执行HQL(Hibernate Query Language)或原生SQL查询。 **知识点七:事务处理** 由于数据库操作通常涉及多条语句,因此需要使用...

    Android应用源码Hibernate4Android.rar

    通过Session的createQuery或createSQLQuery方法,开发者可以构建复杂查询。 6. 数据库初始化 在Android应用启动时,通常需要初始化数据库,包括创建表和填充初始数据。Hibernate4Android提供了...

    Hibernate-HQL.rar_HQL_hibernate hql

    在Hibernate中,通过Session对象的createQuery或createSQLQuery方法创建HQL查询,然后调用list、uniqueResult、scroll等方法执行查询。执行过程中,Hibernate会自动进行类型转换和结果集的封装,极大地降低了开发...

    Hibernate中的查询:HQL、Criteria、原生SQl

    在Java世界中,Hibernate是一个非常流行的持久化框架,它简化了数据库操作,使得开发者可以更加专注于业务逻辑而不是底层数据管理。本篇文章将深入探讨Hibernate中的三种主要查询方式:HQL(Hibernate Query ...

    hibernate code.rar

    在这个“hibernate code.rar”压缩包中,我们很可能会找到关于Hibernate的视频教程——"hibernate介绍与动手入门体验.avi",这个资源将引导我们深入了解Hibernate的核心概念和实际应用。 首先,让我们谈谈Hibernate...

    Hibernate执行持久层访问步骤

    1. HQL查询:使用Session的createQuery()方法创建HQL(Hibernate Query Language)查询对象,然后设置参数,最后调用list()或uniqueResult()执行查询。 2. QBC查询:Query By Criteria API允许基于Java对象属性进行...

    hibernate自定义查询

    在Hibernate中,自定义查询是扩展其功能的重要方式,能够帮助我们实现更复杂的数据库交互需求。本文将深入探讨Hibernate自定义查询的相关知识点。 一、Hibernate HQL查询 Hibernate Query Language (HQL) 是...

    hibernate-release-5.0.0.Final(1).zip

    - 使用find()或get()方法获取对象,或使用createQuery()或createSQLQuery()构建查询语句。 - 在事务中执行批量操作,确保数据的原子性和一致性。 - 利用缓存机制提高数据访问速度,如一级缓存(Session级)和二级...

    hibernate实现增删改查

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

    Hibernate简单的demo

    3. `Query`: `Session`的`createQuery()`方法用于构建HQL(Hibernate Query Language)查询,或者`createSQLQuery()`方法用于构建原生SQL查询。 4. `Criteria API**: 另一种查询方式,提供更面向对象的查询,避免硬...

Global site tag (gtag.js) - Google Analytics