posts - 28,comments - 3,trackbacks - 0
          Hibernate3允許你使用手寫的sql來完成所有的create,update,delete,和load操作(包括存儲過程)    
             
            使用存儲過程來查詢  
            Hibernate   3引入了對存儲過程查詢的支持.   存儲過程必須返回一個結果集,作為Hibernate能夠使用的第一個外部參數(shù).   下面是一個Oracle9和更高版本的存儲過程例子.    
             
            CREATE   OR   REPLACE   FUNCTION   selectAllEmployments    
                    RETURN   SYS_REFCURSOR    
            AS    
                    st_cursor   SYS_REFCURSOR;    
            BEGIN    
                    OPEN   st_cursor   FOR    
              SELECT   EMPLOYEE,   EMPLOYER,    
              STARTDATE,   ENDDATE,    
              REGIONCODE,   EID,   VALUE,   CURRENCY    
              FROM   EMPLOYMENT;    
                        RETURN     st_cursor;    
              END;  
            在Hibernate里要要使用這個查詢,你需要通過命名查詢來映射它.    
             
            <sql-query   name="selectAllEmployees_SP"   callable="true">  
                    <return   alias="emp"   class="Employment">  
                            <return-property   name="employee"   column="EMPLOYEE"/>  
                            <return-property   name="employer"   column="EMPLOYER"/>                          
                            <return-property   name="startDate"   column="STARTDATE"/>  
                            <return-property   name="endDate"   column="ENDDATE"/>                          
                            <return-property   name="regionCode"   column="REGIONCODE"/>                          
                            <return-property   name="id"   column="EID"/>                                                  
                            <return-property   name="salary">    
                                    <return-column   name="VALUE"/>  
                                    <return-column   name="CURRENCY"/>                          
                            </return-property>  
                    </return>  
                    {   ?   =   call   selectAllEmployments()   }  
            </sql-query>   
              
          { ? = call selectAllUsers() } 也可以寫成{ call selectAllUsers() },
          如果有參數(shù)就寫成
          { ? = call selectAllUsers(?,?,?) }
          代碼中對query設置相應位置上的值就OK

          Java調用關鍵代碼如下
                
            Session session = HibernateUtil.currentSession();
            Query query = session.getNamedQuery("selectAllUsers");
            List list = query.list();
            System.out.println(list);

          要求你的存儲過程必須能返回記錄集,否則要出錯
          如果你的存儲過程是完成非查詢任務就應該在配置文件用以下三個標簽
            <sql-insert callable="true">{call createPerson (?, ?)}</sql-insert>
            <sql-delete callable="true">{? = call deletePerson (?)}</sql-delete>
            <sql-update callable="true">{? = call updatePerson (?, ?)}</sql-update> 

            注意存儲過程當前僅僅返回標量和實體.現(xiàn)在不支持<return-join>和<load-collection>     
             
          使用存儲過程的規(guī)則和限制  
                  為了在Hibernate中使用存儲過程,你必須遵循一些規(guī)則.不遵循這些規(guī)則的存儲過程將不可用.如果你仍然想要使用他們,   你必須通過session.connection()來執(zhí)行他們.這些規(guī)則針對于不同的數(shù)據(jù)庫.因為數(shù)據(jù)庫   提供商有各種不同的存儲過程語法和語義.    
             
            對存儲過程進行的查詢無法使用setFirstResult()/setMaxResults()進行分頁。    
             
            對于Oracle有如下規(guī)則:    
             
            存儲過程必須返回一個結果集.它通過返回SYS_REFCURSOR實現(xiàn)(在Oracle9或10),在Oracle里你需要定義一個REF   CURSOR   類型    
             
            推薦的格式是   {   ?   =   call   procName(<parameters>)   }   或   {   ?   =   call   procName   }(這更像是Oracle規(guī)則而不是Hibernate規(guī)則)    
             
            對于Sybase或者MS   SQL   server有如下規(guī)則:    
             
            存儲過程必須返回一個結果集。.注意這些servers可能返回多個結果集以及更新的數(shù)目.Hibernate將取出第一條結果集作為它的返回值,   其他將被丟棄。    
             
            如果你能夠在存儲過程里設定SET   NOCOUNT   ON,這可能會效率更高,但這不是必需的。
          posted on 2007-05-18 08:50 李大嘴 閱讀(2567) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網站導航:
           
          主站蜘蛛池模板: 新源县| 长垣县| 共和县| 玉门市| 邯郸市| 沂源县| 乐山市| 靖边县| 沧源| 普定县| 桦甸市| 福安市| 时尚| 汉川市| 洛川县| 垦利县| 富平县| 铅山县| 礼泉县| 临猗县| 萍乡市| 天等县| 华坪县| 包头市| 阿拉善左旗| 灵武市| 屏东市| 车致| 都兰县| 轮台县| 屯门区| 湟源县| 留坝县| 沙坪坝区| 安图县| 玛曲县| 河池市| 都昌县| 建平县| 噶尔县| 遵义市|