createSQLQuery与createQuery的区别
本文原址 : http://stta04.javaeye.com/blog/377633hibernate 中createQuery与createSQLQuery
昨晚帮同事看代码到凌晨2点多,今早6点醒来发现他发来信息说报空指针错误,实在无法入睡,起来自己测试了一下,控制台还真的报:
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应用中应当注意。
第二种解释
今天想着做一个分页的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();
createSQLQuery与createQuery的区别的更多相关文章
- Hibernate学习之createSQLQuery与createQuery的区别及使用
hibernate中createQuery与createSQLQuery:前者用的hql语句进行查询,后者可以用sql语句查询,前者以hibernate生成的Bean为对象装入list返回,后者则是以 ...
- java.lang.ClassCastException: Ljava.lang.Object; cannot be cast to com.entity.Advertisem异常
今天一不小心就碰到了这样的问题,以前从来没有碰到过,在网上搜了很多办法,思路正确,但是还是要根据自己的程序改变. 一开始写的是hql语句进行统计每个月的数据,但是试了很久,程序一直提醒hql语句异常, ...
- unexpected token: * 和 java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to 解决办法
一.unexpected token: * 的解决办法 首先要搞清楚sql与hql的区别! sql操作的是数据库表,而hql操作的是对象! sql中“select * from table”,而hq ...
- 关于hibernate中多对多关系
关于多对多关系 数据库:在使用多对多的关系时,我们能够使用复合主键.也能够不使用,直接引入外键相同能够实现. 在数据库中使用多对多关系时,须要一个中间表. 多对多关系中的数据库结构例如以下: 表:Or ...
- hibernate使用setResultTransformer()将SQL查询结果放入集合中
在平时开发中Hibernate提供的hql基本能够满足我们的日常需求.但是在有些特殊的情况下,还是需要使用原生的sql,并且希望sql查询出来的结果能够绑定到pojo上.hibernate API中的 ...
- createQuery与createSQLQuery区别
该篇文章也贴上来: hibernate 中createQuery与createSQLQuery两者区别是:前者用的hql语句进行查询,后者可以用sql语句查询前者以hibernate生成的Bean为对 ...
- hibernate 中createQuery与createSQLQuery两者区别
hibernate 中createQuery与createSQLQuery两者区别是:前者用的hql语句进行查询,后者可以用sql语句查询前者以hibernate生成的Bean为对象装入list返回, ...
- herbnate session.createSQLQuery(sql) 和 session.createQuery(sql)使用
public class DistributeDao implements Serializable{ private SessionFactory sessionFactory; public Se ...
- hibernate 中createQuery与createSQLQuery两个用法
hibernate 中createQuery与createSQLQuery两者区别是:前者用的hql语句进行查询,后者可以用sql语句查询前者以hibernate生成的Bean为对象装入list返回后 ...
随机推荐
- jackson 解析结合类(需要传入Class, 和 Class.Class, 回调方法是List<Class>)
import java.util.HashMap; import java.util.List; import org.codehaus.jackson.map.ObjectMapper; impor ...
- MySQL基础学习之函数
数学函数 绝对值 abs() 圆周率 PI() 平方根 sqrt() 模除取余 mod(被除数,除数) 随机数 rand() 四舍五入 round(数字) 次方 ...
- push notification for iphone
由于公司业务需求,以前一直做PHP开发,突然让我研究push notification ,一下子迷糊啦,不知所措,抓狂!但是在自己的努力下还是初有成效!现拿出来显摆一下! 1:push notific ...
- mac 如何让文件隐藏
1.首先,要确保知道目标文件或文件夹的名称,你不把这个名称正确地输入到终端中,Mac也无能为力啊... 2.打开终端,输入chflags hidden 3.在上述代码的后面加上该文件夹的路径,但是注意 ...
- Samba出现“您可能没有权限使用网络资源”解决方法
我最近在Centos6.3上搭建Samba系统,按照配置都已经配置好了,当就是没法在win7下访问,老是弹出以下弹出框: 后来我在网上找资料发现有SELinux这么个东西,然后我就按照配置该了一下就成 ...
- 1024: [SCOI2009]生日快乐 - BZOJ
Description windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕.现在包括windy,一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积的蛋 ...
- 4.3 spring-嵌入式beans标签的解析
对于嵌入式的beans标签,想信大家很少使用过,或者接触过,起码,我本人就没用过. 它非常类似于Import标签所提供的功能; 使用如下: <?xml version="1.0&quo ...
- json2.js使用参考
json2.js的源码地址: https://github.com/douglascrockford/JSON-js Visual Studio用户可以直接通过Nuget来获得. json2.js提供 ...
- PAT-乙级-1012. 数字分类 (20)
1012. 数字分类 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 给定一系列正整数,请按要求对数字进 ...
- PAT-乙级-1011. A+B和C (15)
1011. A+B和C (15) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 HOU, Qiming 给定区间[-231, 231 ...