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

第二种解释

今天想着做一个分页的DAO,用Hibernate从数据库的Question表中取5个数据,这个分页是每次都从数据库中取出一段数据,而不是一次性取所有的数据。

一开始,我的DAO是这么写的:

public List findallquestion(int num,int pagesize){
   int num2=(num-1)*5;
   Session session=getSession();
   String sql="select * from Question limit :num1,:size";
   Query query = session.createSQLQuery(sql);
   query.setParameter("num1",num2);
   query.setParameter("size", pagesize);
   List list=query.list();
   Question question=null;
    for(int i=0;i<list.size();i++)
   {
    question = (Question)list.get(i);
    System.out.print("ID"+question.getId());
    System.out.println("TITLE"+question.getTitle());
   }
   return list;
}

奇怪的事情就这么发生了,

第一,出现了报错:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.njcit.bbs.Question

第二,question对象里面取不出值

这我就奇怪了,我用list.size()发现长度的确是5,和我需要的长度是一致的,为什么会报错,而且取不出呢?

问题应该是question = (Question)list.get(i);list里面不是存放的一条条记录么,为什么不能转成我需要的Bean呢

网上找了很多资料,最后在这里找到了想要的东西:http://helloandy2009.javaeye.com/blog/614369

我们一般在用Hibernate写增删查改的时候,有2中方式,一种是HQL,一种是SQL

实例:

我要执行的语句是:select * from Question

HQL是这么写的:

Session session = getSession();

String hql="from Question";

List list = (Question)session.createQuery(hql).list();

System.out.println(list.getTitle());

测试正常

SQL写法:

Session session=getSession();

String sql="select * from Question"

List list=(Question)session.createSQLQuery(sql).list();//会发生类型转换错误,就是文章开头的那个错误

原因:
HQL中

String hql="from Question";

List list = (Question)session.createQuery(hql).list();

会根据你的hql语句,自动将session.createQuery(hql).list()的返回对象以hibernate生成的Bean为对象装入list返回

SQL中

String sql="select * from Question"

List list=(Question)session.createSQLQuery(sql).list();

则是以对象数组进行存储返回

一句话:HQL:返回list装的是Bean SQL:返回对象就是一数组,数组在转为Question对象时,当然会报错。

解决方法:

第一种:直接老老实实用HQL去写吧= =参数化就百度“Hibernate 参数绑定”就行

第二种:使用原生SQL,调用其中的一个方法addEntity()

String sql="select * from Question";

Query query = session.createSQLQuery(sql).addEntity(XXXXXXX.class);

List list = (Question)query;

这样 list中也就装的是Question这洋一个个Bean对象了,问题还是不知道如何参数化= =!

找到方法了:

Hibernate中的分页语句可以这么写

session = HibernateUtils.getSession();
     session.beginTransaction();
     Query query = session.createQuery("from User");
     query.setFirstResult(0);//从第一条记录开始
     query.setMaxResults(4);//取出四条记录
     List userList = query.list();

转载于:https://www.cnblogs.com/fengbo199307/p/4423293.html

createQuery与createSQLQuery相关推荐

  1. hibernate中createQuery和createSqlQuery

    1.createQuery和createSqlQuery createQuery查询用的是hql,以hibernate生成的bean为对象装入list中返回. createSqlQuery查询用的是s ...

  2. 后端-SSH,HibernateDaoSupport类,createQuery与createSQLQuery方法,uniqueResult()方法

    目录 HibernateDaoSupport类 createQuery与createSQLQuery方法 uniqueResult()方法 HibernateDaoSupport类 1. 继承了Hib ...

  3. createSQLQuery与createQuery的区别

    本文原址 : http://stta04.javaeye.com/blog/377633hibernate 中createQuery与createSQLQuery 昨晚帮同事看代码到凌晨2点多,今早6 ...

  4. Hibernate学习之createSQLQuery与createQuery的区别及使用

    hibernate中createQuery与createSQLQuery:前者用的hql语句进行查询,后者可以用sql语句查询,前者以hibernate生成的Bean为对象装入list返回,后者则是以 ...

  5. 【Hibernate】getHibernateTemplate.find()和session.createQuery()方法总结

    Spring中常用的hql查询方法(getHibernateTemplate().find()) 一.find(String queryString); 示例:this.getHibernateTem ...

  6. createSQLQuery使用uniqueResult的一个错误

    我们都知道在Hibernate中使用createQuery和createSQLQuery的最大区别就是前者是使用hql语句,后者使用的是sql语句 之前在使用createSQLQuery进行selec ...

  7. hibernate系列之一

    通过自己不断的学习框架以及相关知识的学习,自己学会总结了学习路上遇到的一些问题以及疑惑,自己现在跟着相关的学习资料又进行了一些总结和实践,希望通过自己走过的学习之路能够帮助小伙伴们解决一些学习上问题或 ...

  8. 关于java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to 实体类

    由于业务逻辑的复杂,有些sql语句写法hql不支持,所以hibernate查询直接用了sql原生查询,由于数据结果根据四个表查询出来,所以无法使用方法.addEntity(XXXXXXX.class) ...

  9. JavaEE知识体系

    1 1.文件上传下载 1.1 文件上传 1.1.1 文件上传的作用 例如网络硬盘!就是用来上传下载文件的. 在智联招聘上填写一个完整的简历还需要上传照片呢. 1.1.2 文件上传对页面的要求 1.必须 ...

最新文章

  1. Androidstudio下Generate signed apk提示Error: Expected resource of type id [ResourceType]解决办法...
  2. c#语言程序设计实例,C#语言程序设计用.ppt
  3. 基于MTCNN的人脸自动对齐技术原理及其Tensorflow实现测试
  4. android test.apk,app-debug.apk和app-debug-androidTest.apk在安装macaca-android模块的时候build失败...
  5. vb破解万能断点816c24
  6. 1spring注解:@Configuration,@Bean,@ComponentScan(),@Scope
  7. [From 1.1~1.2]CLR的执行模型
  8. Palo Alto Networks漏洞防护扩展至云端
  9. stm32定时2通道3映射_stm32学习笔记之问题总结
  10. Android 源码编译过程
  11. 新华三(H3C)校园招聘技术类笔试题2019
  12. 特来电支付中心总体介绍
  13. POJ 3744 Scout YYF I(矩阵快速幂优化+概率dp)
  14. php:php-fpm平滑重启为什么无效
  15. Android批量添加联系人到通讯录
  16. 全渠道营销+线上线下结合新零售数字门店saas系统
  17. 音频倍速(变速不变调)的实现
  18. gss1_GSS简介:网格样式表
  19. 2017年6月历史文章汇总
  20. scipy.signal.peak_prominences解析

热门文章

  1. ARM64的启动过程之(二):创建启动阶段的页表
  2. latex转word_Latex与word转换及相关问题解决方法
  3. 蛋白质合成有关的分子生物学知识问答
  4. 2019年, image captioning论文汇总
  5. php 把数组赋给另一个数组,php将一个数组附加到另一个数组(不是array_push或+)
  6. python 宏处理库_常用的Python库,给大家分享一下!
  7. PHP基础3--文件加载-错误处理
  8. lamp一键安装包的一些注意点
  9. [Trie] Luogu P2580 于是他错误的点名开始了
  10. 桐花万里python路-基础篇-01-历史及进制