【第22期】观点:IT 行业加班,到底有没有价值?

createSQLQuery与createQuery的区别

原创 2016年08月28日 23:10:08

昨晚帮同事看代码到凌晨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();

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

web项目连接数据库的问题

public Connection OpenConnection() {         Connection conn = null;         try {             Conte...

关于SQLSERVER数据库安装时要求重启时(无限要求)重启问题

安装SQLSERVER2008时出了个错要求重启 重启后他还是要求我重启我重启了很多次也没有用就查了下时注册表的问题 解决方法如下 window运行:regedit 然后找到 HKEY_LOCA...

一只小猩猩

Oracle限权管理

Oracle分配权限   以管理员身份登录数据库   www.2cto.com   创建用户:create user [username] identified by [pas...

Struts的上传和下载

在做B/S系统时,通常会涉及到上传文件和下载文件,在没接struts2框架之前,我们都是使用apache下面的commons子项目的FileUpload组件来进行文件的上传,但是那样做的话,代码看起来...

关于把查询的数据合并成一列的问题

需求是这样的 查询出考勤信息 考勤信息有四个时间段 上午上班 上午下班 下午上班 下午下班四个时间段!查询出的结果是这样的查询出的结果我想把同一天的打卡记录放在一行 这种就要用到一个linq的jar包...

Oracle所有分析函数

Oracle分析函数   Oracle分析函数——函数列表   SUM        :该函数计算组中表达式的累积和 MIN        :在一个组中的数据窗口中查找表达式的最小值 MA...

oracle分析函数技术详解(配上开窗函数over())

一、Oracle分析函数入门 分析函数是什么? 分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个...

Oracle分析函数

分析函数(OVER) 1 分析函数2(Rank, Dense_rank, row_number) 6 分析函数3(Top/Bottom N、First/Last、NTile) 10 窗口函数 14 报...

oracle分析函数

Oracle开发专题之:分析函数(OVER)1 Oracle开发专题之:分析函数2(Rank, Dense_rank,row_number)6 Oracle开发专题之:分析函数3(Top/Bott...
  • zj0078
  • zj0078
  • 2014-03-27 16:21
  • 4125
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)