日期:2014-05-16  浏览次数:20359 次

使用hibernate调用存储过程(当返回结果不是具体对应的实体时)
   在java中,可以直接用jdbc调用存储过程,但是,如果项目中使用到了hibernate,那么我倾向使用hibernate来调用存储过程,使用jdbc或jdbcTemplate调用存储过程,代码实在太臃肿难看了。  网上查了很多资料,全是千篇一律,你抄我,我抄你,都是在调用存储过程时,还要具体的映射一个实体对象和一张表,
如:

   <class name="xxx.XxxxVO" table="proctest">
        <id name="id" column="id">
            <generator class="native"/>
        </id>
        
        <property name="name" column="name" type="string" />
        <property name="age" column="age" type="integer" />
        <property name="address" column="address" type="string" />

    </class>

  
     <sql-query name="getTest" callable="true">
     <return alias="test" class="xxx.XxxxVO">
     
     <return-property name="id" column="id" />
      <return-property name="name" column="name" />
       <return-property name="age" column="age" />
        <return-property name="address" column="address" />
     </return>
       {call testProc(?)}
     </sql-query>


   如上例一样,我就纳闷了,这样的存储过程的调用,有多少意义,大多情况下,存储过程返回的结果集是复杂的结构,根本不是一张表对应的结构,可能在存储过程中操作了很多很多个表,包括N个临时表,此时,你让我对应哪个实体去?
    但是自己尝试,原来是可以不对应实体的,即把sql-query 标签中的return模块直接去掉即可,如:
         <sql-query name="stat_corp_checkup_plan_pack_pro" callable="true">
     	{call yikang365.stat_corp_checkup_plan_pack_pro(?)}
     </sql-query>


    那么,上例可以改成如下:
     <sql-query name="getTest" callable="true">
           {call testProc(?)}
     </sql-query>


   这样就可以不必要对应具体的实体对象和表了,可以做任意复杂的查询了,不过,这种情况下返回的是数组列表,
即List<Object[]> 格式的对象。