`

hibernate 中createQuery与createSQLQuery

 
阅读更多

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 的createSQLQuery的几种用法

    hibernate 的createSQLQuery的几种用法总结

    Hibernate中的query 分页.doc

    Hibernate中的query 博客分类: • Hibernate HibernateSQLSQL ServerMySQLJDBC Hibernate中的query.setFirstResult(),query.setMaxResults(); 一、query.scroll()和query.setFirstResult(),query....

    Hibernate 高级配置

    1. Hibernate与触发器协同工作 1)、触发器使session的缓存中的数据与数据库中的数据不一致 2)、session的update()方法盲目的激发触发器 2. Hibernate中的createQuery方法 1)、uniqueResult()方法,返回一个单个...

    Hibernate3使用经验

    1.Hibernate中配置参数 /** * 注意:HQL中使用参数的方法: * 1.根据参数名称来设置参数:匹配名称; * 2.根据参数位置来设置参数:匹配位置; */ //根据参数名称来设置参数 Query query = session.createQuery(...

    hibernate操作数据库笔记

    //该方法将到classpath下解析hibernate.cfg.xml中的配置,如果不用Hibernate默认的配置文件名和路径,可在该方法中指定Hibernate配置文件的名称和路径 2.用Configuration对象获取SessionFactory和Session对象:...

    hibernate二级缓存

    在一个数据库系统中,如果缓存设置的合适,那么可以极大的提高系统的效率,Hibernate作为一个ORM工具 提供了缓存的机制,包括一级(Session级)缓存和二级(SessionFactory级)缓存。这里主要总结一下二级缓存。 1....

    Hibernate使用中防止SQL注入的几种方案

    Hibernate使用中防止SQL注入的几种方案 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。  在获取便利操作的同时...

    JSP开发中hibernate框架的常用检索方式总结

    对象导航检索:根据某个对象导航查询与该对象关联的对象数据 HQL检索:通过query接口对象查询 QBC检索:通过criteria接口对象查询 SQL检索:通过SQL语句查询  2、HQL检索方式: 查询全部数据:session....

    mysql+jdbc+jsp+Hibernate3.2+tomcattomcat5.028成功测试

    mysql,jdbc,Hibernate,tomcat [mysql+jdbc+jsp+Hibernate3.2+tomcattomcat5.028成功测试-简单] <br> 1 .数据库设计:库mydb 表events <br>EVENT_ID BIGINT(20) NOT NULL AUTOINC EVENT_DATE DATETIME...

    hibernate更新数据方法小结

    Session session=HibernateSessionFactory.getSession(); String sql=”from Usertable as user where user.username=?”; Query q=session.createQuery(sql); q.setString(0,username); List l=q.list(); Iterator...

    Hibernate 修改数据的实例详解

    Hibernate 修改数据 1.用 HQL方式来更新 在 这里修改 Person 的name 和age 通过 id 标识 Session currentSession = H3Utils.getCurrentSession(); currentSession.beginTransaction(); //创建 HQL String ...

    hql查询语句

    Query query=session.createQuery("select count(*) from Student") //avg()取得Student平均年龄 Query query=session.createQuery("select avg(s.age) from Student as s") //upper()方法将字符串转为大写...

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

    (1)获取Hibernate Session对象; (2)编写HQL语句; (3)以HQL语句作为参数,调用Session的createQuery方法创建查询对象; (4)如果HQL语句包含参数,调用Query的setXxx方法为参数赋值; (5)调用Query对象的list等方法...

    用户管理系统

    Query query=session.createQuery(hql) ; query.setString(0, u.getUsername()); query.setString(1, u.getUserpass()); query.setInteger(2, u.getUserright()); List<User> list=query.list(); if...

    EJB3.0开发文档

    EJB3.0开发文档,适合新手,EJB3.0比2.0要开发容易多了,讲的很好

    spring_MVC源码

    createQuery(final String queryString); 07. public Object save(final Object model); 08. public void update(final Object model); 09. public void delete(final Object model); 10.} [java] ...

    aws-ec2-running:查询AWS以运行EC2实例

    var createQuery = require ( 'aws-ec2-running' ) ; createQuery(opts [,clbk]) 创建一个新的Query实例,以从检索running EC2实例的列表。 var opts = { 'key' : 'XXXXXXXXXXXXXXXXXX' , 'secret' : '...

    aws-ec2-metrics:查询AWS以获取运行EC2实例的指标

    var createQuery = require ( 'aws-ec2-metrics' ) ; createQuery(opts [,clbk]) 创建一个新的Query实例,以从检索running EC2实例的指标。 var opts = { 'key' : 'XXXXXXXXXXXXXXXXXX' , 'secret' : '...

    springboot-jpa-restful

    数据库= H2(在内存数据库中) JPA访问数据库 克隆项目并使用8055端口运行 CriteriaBuilder qb = entityManager . getCriteriaBuilder(); CriteriaQuery< Long> cq = qb . createQuery( Long . class); cq . ...

Global site tag (gtag.js) - Google Analytics