最近需要把hibernate2 升级至 hibernate3
有一个功能是通过sql查询语句得到所查询的字段名。
原来在hibernate2中可以通过session直接得到数据连接中的connection,然后就很好得出所查询的字段名了。可是在hibernate3中,通过session得到的connection方法已经废弃。
我尝试着用createSQLQuery(sql)来实现这个功能。这个方法可以返回一个List<Map<String, object>.
然后通过map也可以得到所查询的字段名。
但是有一个问题如果sql没有查询出任何数据,list的长度为0.即得不到map
也就得不到字段名了
请问大家有没有什么好的解决办法
不胜感激!!!!!!!!!

解决方案 »

  1.   

    关于将Hibernate2升级为Hibernate3的基本步骤说明 
    最近在一个项目开发基本完成进入正式试运行的时候,有了一个想法:将项目的Hibernate2.1升级为Hibernate3。由于公司多年来的技术沉淀,以及整体框架和整个平台的搭建是在去年就已完成了的(主要也是我来设计的),当时出于一个安全(风险方面)的考虑,采用的是Struts 1.2.8+Hibernate 2.1+ Spring 
    如何把Hibernate2升级到3  
    http://wenku.baidu.com/view/20a384e9856a561252d36f81.html
    http://www.javaeye.com/topic/1238461.2.8。由于我从04以来一直是用这一套,感觉还比较顺手,所以当时就直接给现在这家软件公司设计出了这一套框架……网上也有很多这些文档的说明,但个人觉得都是一些抄来抄去的。所以,现在将我个人的做法分以下八步来给大家说一下,方便更多朋友熟悉一下hibernate2和hibernate3的差别,给当前项目一点扩展的空间。 
    第一步:换jar包 
    即将hibernate2.1.jar包换成hibernate3.jar,这一步很简单这里就不具体说了。 
    第二步:修改Hibernate.cfg.xml文件(由于项目有遗留的原因)这里有部份模块采用的是Struts+Hibernate框架的 
    即将hibernate.cfg.xml文件中的 
    <!DOCTYPE hibernate-configuration PUBLIC 
              "-//Hibernate/Hibernate Configuration DTD 2.0//EN"          "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd"> 改为: <!DOCTYPE hibernate-configuration PUBLIC 
              "-//Hibernate/Hibernate Configuration DTD 3.0//EN"          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 当然如果你是采用的hibernate.properties的方式那也是类似地做一些修改 第三步: 修改ApplicationContext.xml文件 (其实这才是真正使用spring集成hibernate时所用的配置文件) 
    即将ApplicationContext.xml文件中的sessionFacotry/mySessionFactory Bean的配置做相应的修改。具本如下: 
    将先前的: 
    <bean id="mySessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean"> 
    ………</bean> 
    修改为: 
    <bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    ………</bean> 
    第四步:修改事务配置信息 (我个人认为我们应该将每个不同的管理分放到不同的文件中,比如:我这里我是将事务,日志管理以及sessionFactory分开放了,)我这是applicationcontext_transaction.xml文件 
    即将applicationcontext_transaction.xml文件中的transactionManager 对象的内容做相应的修改:具体如下: 
    将: 
    <!--transactionManager--> 
    <bean id="transactionManager" 
    class="org.springframework.orm.hibernate.HibernateTransactionManager"> 
    <property name="sessionFactory"> 
    <ref bean="mySessionFactory" /> 
    </property> 
    </bean> 修改为: 
    <!--transactionManager--> 
    <bean id="transactionManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory"> 
    <ref bean="mySessionFactory" /> 
    </property> 
    </bean> 
    第五步:修改xxx.hbm.xml文件 
    将<!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 2.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" > 
    修改为: 
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > 第六步:修改java文件中的引入import 
    将所有程序中的net.sf.hibernate替换为org.hibernate 
    但是有例外 
      net.sf.hibernate.expression.Expression换为org.hibernate.criterion.Expression 
      如果用eclipse,用ctrl+shift+o快捷键可以加快速度 第七步:修改一些Hibernate3废弃的方法 
    在Hibernate3.0中,原来Hibernate2.1的Session接口中的有些基本方法也被废弃,但为了简化升级,这些方法依然是可用的,可以通过org.hibernate.classic.Session子接口来访问它们,例如:  
       
       
      org.hibernate.classic.Session   session=sessionFactory.openSession();  
      session.delete("delete   from   Customer   ");  
       
       
      在Hibernate3.0中,org.hibernate.classic.Session接口继承了org.hibernate.Session接口,在org.hibernate.classic.Session接口中包含了一系列被废弃的方法,如find()、interate()等。SessionFactory接口的openSession()方法返回org.hibernate.classic.Session类型的实例。如果希望在程序中完全使用Hibernate3.0,可以采用以下方式创建Session实例:  
       
      org.hibernate.Session   session=sessionFactory.openSession();  
       
      如果是对已有的程序进行简单的升级,并且希望仍然调用Hibernate2.1中Session的一些接口,可以采用以下方式创建Session实例:  
       
      org.hibernate.classic.Session   session=sessionFactory.openSession();  
       
      在Hibernate3.0中,Session接口中被废弃的方法包括:  
      *   执行查询的方法:find()、iterate()、filter()和delete(String   hqlSelectQuery)    
      *   saveOrUpdateCopy()  
       
      Hibernate3.0一律采用createQuery()方法来执行所有的查询语句,采用DELETE   查询语句来执行批量删除,采用merge()方法来替代   saveOrUpdateCopy()方法。  
       
       
      提示:在Hibernate2.1中,Session的delete()方法有几种重载形式,其中参数为HQL查询语句的delete()方法在Hibernate3.0中被废弃,而参数为Ojbect类型的的delete()方法依然被支持。delete(Object   o)方法用于删除参数指定的对象,该方法支持级联删除。  
       
      Hibernate2.1没有对批量更新和批量删除提供很好的支持,参见<<精通Hibernate>>一书的第13章的 (批量更新和批量删除),而Hibernate3.0对批量更新和批量删除提供了支持,能够直接执行批量更新或批量删除语句,无需把被更新或删除的对象先加载到内存中。以下是通过Hibernate3.0执行批量更新的程序代码:  
       
      Session   session   =   sessionFactory.openSession();  
      Transaction   tx   =   session.beginTransaction();  
       
      String   hqlUpdate   =   "update   Customer   set   name   =   :newName   where   name   =  ldName";  
      int   updatedEntities   =   s.createQuery(   hqlUpdate   )  
      .setString(   "newName",   newName   )  
      .setString(   "oldName",   oldName   )  
      .executeUpdate();  
      tx.commit();  
      session.close();  
       
      以下是通过Hibernate3.0执行批量删除的程序代码:  
       
      Session   session   =   sessionFactory.openSession();  
      Transaction   tx   =   session.beginTransaction();  
       
      String   hqlDelete   =   "delete   Customer   where   name   =  ldName";  
      int   deletedEntities   =   s.createQuery(   hqlDelete   )  
      .setString(   "oldName",   oldName   )  
      .executeUpdate();  
      tx.commit();  
      session.close(); 希望对你有帮助
      

  2.   

    你的sql语句不该取数据,而是取表结构.