<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 28,comments - 3,trackbacks - 0
    Hibernate3允許你使用手寫的sql來完成所有的create,update,delete,和load操作(包括存儲過程)    
       
      使用存儲過程來查詢  
      Hibernate   3引入了對存儲過程查詢的支持.   存儲過程必須返回一個結果集,作為Hibernate能夠使用的第一個外部參數.   下面是一個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() },
    如果有參數就寫成
    { ? = 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> 

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

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


    網站導航:
     
    主站蜘蛛池模板: 91麻豆精品国产自产在线观看亚洲 | 国产高清视频免费在线观看| 夜夜嘿视频免费看| 亚洲www在线观看| 最新猫咪www免费人成| 亚洲乱码日产精品一二三| 在线成人a毛片免费播放| 亚洲成AV人片高潮喷水| 日韩成人免费视频播放| 午夜在线亚洲男人午在线| 免费在线观看你懂的| 一区二区三区视频免费观看| 亚洲伊人成无码综合网| 老司机精品免费视频| 亚洲一区二区影院| 7723日本高清完整版免费| 亚洲aⅴ天堂av天堂无码麻豆| 亚洲成A人片在线观看中文| 久久九九久精品国产免费直播| 亚洲国产日韩在线视频| 69av免费观看| 亚洲中文字幕无码久久| 亚洲国产成人久久综合区| 伊人久久大香线蕉免费视频| 亚洲韩国在线一卡二卡| 最近的中文字幕大全免费8| 久久亚洲最大成人网4438| 无码国模国产在线观看免费 | 久久免费99精品国产自在现线| 国产亚洲美女精品久久久久狼| 97青青草原国产免费观看| 亚洲精品无播放器在线播放 | 亚洲成色WWW久久网站| 999久久久免费精品国产| 国产成人高清亚洲一区91| 亚洲精品无码不卡在线播放HE | 222www免费视频| 国产午夜亚洲精品不卡免下载| 久久精品国产亚洲网站| 我要看WWW免费看插插视频| 久久久久久噜噜精品免费直播|