當前位置:首頁 » 存儲配置 » hibernate調用存儲過程

hibernate調用存儲過程

發布時間: 2023-04-27 19:36:12

① Hibernate中調用存儲過程並傳入Date型的參數出問題

你試驗一下
首先將日期格式轉換成你要的格式
SimpleDateFormat f = new SimpleDateFormat("yyyy-mm-dd hh:cc:ss");
保存的時候為
session.save(f.format(new Date());
試驗一下
另外在hibernate中設置date類型看看給它的長度也就是length是否超過

② 如何通過hibernate去調用存儲過程

說實話還真看不出來hibernate調用存儲過程有什麼優勢
java代碼 CREATE TABLE `proctab` ( `id` int ( 11 ) NOT NULL auto_increment, `Name` varchar ( 20 ), `age` int ( 11 ), PRIMARY KEY (`id`) ) CREATE TABLE `proctab` ( `id` int ( 11 ) NOT NULL auto_increment, `Name` varchar ( 20 ), `age` int ( 11 ), PRIMARY KEY (`id`) )
簡單的存儲過程
Java代碼 create PROCEDURE proc() begin select * from proctab; end ; create PROCEDURE proc() begin select * from proctab; end ;
一種方法是通過hibernate傳統的xml映射方式去調用
Java代碼 <class name="com.test.User" table="proctab"> <id name="id" column="id"> <generator class="native"/> </id> <property name="name" column="name" type="string" /> <property name="age" column="age" type="integer" /> </class> <sql-query name="getUser" callable="true"> <return alias="user" class="com.test.User"> <return-property name="id" column="id" /> <return-property name="name" column="name" /> <return-property name="age" column="age" /> </return> {call proc()} </sql-query> <class name="com.test.User" table="proctab"> <id name="id" column="id"> <generator class="native"/> </id> <property name="name" column="name" type="string" /> <property name="age" column="age" type="integer" /> </class> <sql-query name="getUser" callable="true"> <return alias="user" class="com.test.User"> <return-property name="id" column="id" /><return-property name="name" column="name" /> <return-property name="age" column="age" /> </return> {call proc()} </sql-query>
調用方法
Java代碼 Session ss= HibernateSessionFactory.getSession() List li=ss.getNamedQuery("getUser").list(); ss.close(); Session ss= HibernateSessionFactory.getSession() List li=ss.getNamedQuery("getUser").list(); ss.close();
及其類似jdbc的方法
Java代碼 Session session =HibernateSessionFactory.getSession(); Connection conn = session.connection(); ResultSet rs =null; CallableStatement call = conn.prepareCall("{Call proc()}"); rs = call.executeQuery(); rs.close(); session.close(); Session session =HibernateSessionFactory.getSession(); Connection conn = session.connection(); ResultSet rs =null; CallableStatement call = conn.prepareCall("{Call proc()}"); rs = call.executeQuery(); rs.close(); session.close();
這種方法基本上就是jdbc

還有就是通過強大的createSQLQuery來實現
個人比較喜歡這種方法
Java代碼 Session session =HibernateSessionFactory.getSession(); SQLQuery query = session.createSQLQuery("{Call proc()}"); List list =query.list(); session.close(); Session session =HibernateSessionFactory.getSession(); SQLQuery query = session.createSQLQuery("{Call proc()}"); List list =query.list(); session.close();
如果沒有返回值 直接用execute的方法就可以了
還有一個重要的問題就是存儲過程的傳參問題
Java代碼 CallableStatement call = conn.prepareCall("{Call proc(?)}"); call.setString(1, 參數); rs = call.executeQuery(); CallableStatement call = conn.prepareCall("{Call proc(?)}"); call.setString(1, 參數); rs = call.executeQuery();
Java代碼 SQLQuery query = session.createSQLQuery("{Call proc(?)}"); query.setString(0, 參數); List list =query.list();

③ hibernate 存儲過程問題 Caused by: java.sql.SQLException: ORA-06550: 第 1 行, 第 7 列: PLS-00905:

我想你java里定義的應該是float或者double類型吧?float是精確到小數點後6位,double是15位..所以你的222.00應該保存的比這個要更精確,而你的oracle里,只精確了兩位所以....就是這個錯誤了,其實如果要求不嚴的話,直接定義成number就行了,那麼接到的值是什麼精度什麼類型的他就自動存了.

④ 我在做hibernate調用存儲過程的時候報了一個無效索引不知道是哪裡出了問題請高手解決

先檢查你的存儲過程能不能執行,直接在資料庫上執行,先不用hibernate.....

⑤ 最近幾天一直在搞Mybatis調用存儲過程的問題,用<select>標簽寫的那種!然後用Java里寫調用函數

ibatis:sql需要自己寫
hibernate:sql自動生成
上面是最大的區別,下面是一些細節.
選擇Hibernate還是iBATIS都有它的道理:
Hibernate的特點:
Hibernate功能強大,資料庫無關性好,O/R映射能力強,如果你對Hibernate相當精通,而且對Hibernate進行了適當的封裝,那麼你的項目整個持久層代碼會相當簡單,需要寫的代碼很少,開發速度很快,非常爽。以資料庫欄位亂春塌一一對應映射得到的PO和Hibernte這種對象化映射得到的PO是截然不同的,本質區別在於這種PO是扁平化的,不像Hibernate映射的PO是可以表達立體的對象繼承,聚合等等關系的,這將會直接影響到你的整個軟體系統的設計思路。Hibernate對資料庫結構提供了較為完整的封裝,Hibernate的O/R Mapping實現了POJO 和資料庫表之間的映射,以及SQL 的自動生成和執行。程序員往往只需定義好了POJO 到資料庫表的映射關系,即可通過Hibernate 提供的方法完成持久層操作。程序員甚至不需要對SQL 的熟練掌握, Hibernate/OJB 會根據制定的存儲邏輯,自動生成對應的SQL 並調用JDBC 介面加以執行。Hibernate的缺點就是學習門檻不低,要精通門檻更高,而且怎麼設計O/R映射,在性能和對象模型之間如何權衡取得平衡,以及怎樣用好Hibernate方面需要你的經驗和能力都很強才行,但是Hibernate現在已經是主流O/R Mapping框架,從文檔的豐富性,產品的完善性,版本的開發速度都要強於iBATIS。
iBATIS的特點:
iBATIS入門簡單,即學即用,提供了資料庫查詢的自動對象綁定嘩圓功能,而且延續了很好的SQL使用經驗,對於沒有那麼高的對象模型要求的項目來說,相當完美。iBATIS的缺點就是框架還是比較簡陋,功能尚有缺失,雖然簡化了數據綁定代碼,但是整個底層資料庫查詢實際還是要自己寫的,工作量也比較大,而且不太容易適應快速資料庫修改。當系統屬於二次開發,無法對資料庫結構做到控制和修改,那iBATIS的靈活性將比Hibernate更適合。系統數據處理量巨大,性能要求極為苛刻,這往往意味著我們必須通過經過高度優化的SQL語句(或存儲過程)才能達到系統性能設計指標。在這種情況下iBATIS會有更好的可控性和表現。
對於實際的開發進行的比較:
1. iBATIS需要手寫sql語句,也可以生成一森弊部分,Hibernate則基本上可以自動生成,偶爾會寫一些Hql。同樣的需求,iBATIS的工作量比 Hibernate要大很多。類似的,如果涉及到資料庫欄位的修改,Hibernate修改的地方很少,而iBATIS要把那些sql mapping的地方一一修改。
2. iBatis 可以進行細粒度的優化
比如說我有一個表,這個表有幾個或者幾十個欄位,我需要更新其中的一個欄位,iBatis 很簡單,執行一個sql UPDATE TABLE_A SET column_1=#column_1# WHERE id=#id# 但是用 Hibernate 的話就比較麻煩了,預設的情況下 hibernate 會更新所有欄位。 當然我記得 hibernate 有一個選項可以控制只保存修改過的欄位,但是我不太確定這個功能的負面效果。
例如:我需要列出一個表的部分內容,用 iBatis 的時候,這裡面的好處是可以少從資料庫讀很多數據,節省流量SELECT ID, NAME FROM TABLE_WITH_A_LOT_OF_COLUMN WHERE ...一般情況下Hibernate 會把所有的欄位都選出來。比如說有一個上面表有8個欄位,其中有一兩個比較大的欄位,varchar(255)/text。上面的場景中我為什麼要把他們也選出來呢?用hibernate 的話,你又不能把這兩個不需要的欄位設置為lazy load,因為還有很多地方需要一次把整個 domain object 載入出來。這個時候就能顯現出ibatis 的好處了。如果我需要更新一條記錄(一個對象),如果使用 hibernate,需要現把對象 select 出來,然後再做 update。這對資料庫來說就是兩條sql。而iBatis只需要一條update的sql就可以了。減少一次與資料庫的交互,對於性能的提升是非常重要。
3. 開發方面:
開發效率上,我覺得兩者應該差不多。可維護性方面,我覺得 iBatis 更好一些。因為 iBatis 的 sql 都保存到單獨的文件中。而 Hibernate 在有些情況下可能會在 java 代碼中保sql/hql。相對Hibernate「O/R」而言,iBATIS 是一種「Sql Mapping」的ORM實現。 而iBATIS 的著力點,則在於POJO 與SQL之間的映射關系。也就是說,iBATIS並不會為程序員在運行期自動生成SQL 執行。具體的SQL 需要程序員編寫,然後通過映射配置文件,將SQL所需的參數,以及返回的結果欄位映射到指定POJO。使用iBATIS 提供的ORM機制,對業務邏輯實現人員而言,面對的是純粹的Java對象,這一層與通過Hibernate 實現ORM 而言基本一致,而對於具體的數據操作,Hibernate會自動生成SQL 語句,而iBATIS 則要求開發者編寫具體的SQL 語句。相對Hibernate而言,iBATIS 以SQL開發的工作量和資料庫移植性上的讓步,為系統設計提供了更大的自由空間。
4. 運行效率
在不考慮 cache 的情況下,iBatis 應該會比hibernate 快一些或者很多。
上面是hibernate和ibatis的區別。
現在說一說對於手寫sql和存儲過程的支持:
這些東西其實我們都不需要擔心,這種框架能被大家接受就說明像這種功能那是必須的,一定要支持,否肯定被人扣板磚!
hibernate對手寫sql和存儲過程都有很好的支持,對於手寫sql有的時候還是有必要的,如對於非常復雜的sql語句,可能對於我們用hql語句是很難完成的,這個時候就需要我們用sql來完成,相對於hql,我們還是比較熟練sql的!存儲過程的支持也是必要的,和只需簡單的一句:CallableStatement cstmt = con.prepareCall(procere); 就能對已有存儲過程的調用。
ibatis這我就不多少了,一樣,都有很好的支持。
存在就有其合理性,對於不同的情況,我們會有不同的解決方案,所以不要輕易的說那個那個功能不好,沒准他就是你解決難題的殺手鐧!

⑥ hibernate獲取存儲過程返回值

當然是他內部做的。 適合所有資料庫。 追問: 大俠。可否講明白點。舉個例子? 小的愚笨。還望指點 回答: hibernate提供了在*.hbm.xml中配置調用存儲過程,並通過向用戶提供session.getNamedQuery("…")方法來調用配置的調用查詢相關的存儲過程的方法,另外,hibernate還提供了卜悄取得sql的connection的方法,從而能夠通過connection中存儲過程調用相關的方燃滾法來實皮弊余現存儲過程的調用。 注意這兩種存儲過程的調用方式是不同的,在Hiberante是方便了查詢,它可以在*.hbm.xml中配置存儲過程返回值的信息,然後通過配置,就可以把返回值封裝成對象的集合。而使用持久化的存儲過程,那就還是要直接使用到JDBC調用存儲過程的API即使用到 CallableStatement對象。 追問: 目前我存儲過程中的返回值是 1,結果集 2,int 3,String你的意思。我在hbm.xml中配置完返回值後。不需要在java代碼中。像jdbc那樣。指明返回值嗎? 也就是說。我只要在代碼中query.setXXX(0,XXX);這個。指明。輸入參數就可以了》?out參數。直接用 List list = query.list();就能得到所有的返回值嗎? 回答: 不出意外的話就應該出來了。 呵呵你測試一下。

⑦ Hibernate 調用存儲過程 該語句沒有返回結果集

修改存儲過程試試:
alter procere test()
as
SET NOCOUNT ON --加上這句話;有的出現這個問題,加上之後問題解決了;嘿嘿

熱點內容
鞍山dns的伺服器地址是多少 發布:2025-02-12 05:33:47 瀏覽:859
伺服器ip轉載 發布:2025-02-12 05:19:12 瀏覽:296
oraclesql插入數據 發布:2025-02-12 05:19:05 瀏覽:918
stl源碼剖析筆記 發布:2025-02-12 05:01:51 瀏覽:589
教務系統web伺服器搭建 發布:2025-02-12 05:01:17 瀏覽:98
全國dns伺服器地址大全 發布:2025-02-12 05:01:13 瀏覽:683
安卓什麼軟體能拍到月亮 發布:2025-02-12 04:59:42 瀏覽:782
手機卡忘記服務密碼怎麼辦 發布:2025-02-12 04:59:10 瀏覽:374
如何讓助理伺服器可以被遠程 發布:2025-02-12 04:47:11 瀏覽:770
存儲空間不足但 發布:2025-02-12 04:46:27 瀏覽:278