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

hibernate4調用存儲過程

發布時間: 2023-09-09 08:33:30

1. hibernate中調用存儲過程,如果返回了多個結果集,怎麼處理

過程如下:
public Boolean doInHibernate(Session session)
throws HibernateException, sqlException {
try{
Transaction tr = session.beginTransaction();
SQLQuery query = session.createSQLQuery("{call CommandAdapter(?,?,?,?)}");
query.setString(0,"ls");
query.setInteger(1, machineid);
query.setString(2, param);
query.setInteger(3, 0); //
query.executeUpdate();
tr.commit();
return true;
}catch(Exception e){
e.printStackTrace();
return false;
}finally{

session.close();

}
}

使用hibernate調用帶參數返回值的存儲過程方法

在調用帶參數返回值的方法時,需使用到CallableStatement對象。因此,首先得設法獲取一個Connection。

獲取Connection 方法:

(1)session.connection();//此方法目前已被棄用

(2)SessionFactoryUtils.getDataSource(sessionFactory).getConnection()


過我在使用SessionFactoryUtils.getDataSource(sessionFactory)時,一直獲取的都是空值,為此參考
SessionFactoryUtils的源代碼直接利用ConnectionProvider對象來獲取一個Connection實例。

完整代碼:

SessionFactory sessionFactory=this.getSessionFactory();
if (sessionFactory instanceof SessionFactoryImplementor){
ConnectionProvider cp = ((SessionFactoryImplementor) sessionFactory).getConnectionProvider();
try {

CallableStatement statement = cp.getConnection().prepareCall(
"{call MachineDataQuery(?,?,?,?,?,?,?,?,?,?,?,?,?,?)}");
statement.setInt(1, machineId);
statement.setInt(2, jobId);
statement.setInt(3, partTypeId);
statement.setInt(4, compentId);
statement.setInt(5, opId);
statement.setInt(6, roleId);
statement.setInt(7, userId);
statement.setString(8, sd);
statement.setString(9, ed);
statement.registerOutParameter(10, Types.FLOAT);
statement.registerOutParameter(11, Types.FLOAT);
statement.registerOutParameter(12, Types.FLOAT);
statement.registerOutParameter(13, Types.FLOAT);
statement.registerOutParameter(14, Types.FLOAT);
statement.execute();
System.out.println(statement.getFloat(10));
System.out.println(statement.getFloat(11));
System.out.println(statement.getFloat(12));
System.out.println(statement.getFloat(13));
System.out.println(statement.getFloat(14));
} catch (SQLException e) {
e.printStackTrace();
}finally{
cp.close();
}
}

ps:切記存儲過程中不可有多餘的print或select語句,否則會拋出異常「com.microsoft.sqlserver.jdbc.SQLServerException: 已生成用於更新的結果集。」

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

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

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

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

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

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

5. 最近幾天一直在搞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這我就不多少了,一樣,都有很好的支持。
存在就有其合理性,對於不同的情況,我們會有不同的解決方案,所以不要輕易的說那個那個功能不好,沒准他就是你解決難題的殺手鐧!

熱點內容
c語言鏈表的排序 發布:2025-01-25 06:48:17 瀏覽:887
查看存儲空間的命令 發布:2025-01-25 06:40:06 瀏覽:610
安卓系統如何保活 發布:2025-01-25 06:36:27 瀏覽:779
緩存不退出 發布:2025-01-25 06:35:02 瀏覽:265
protel編譯 發布:2025-01-25 06:35:00 瀏覽:203
bt我的世界伺服器 發布:2025-01-25 06:33:35 瀏覽:392
桃子解壓碼 發布:2025-01-25 06:26:46 瀏覽:726
ubuntu飢荒伺服器搭建伺服器 發布:2025-01-25 06:19:54 瀏覽:51
安卓怎麼登錄蘋果碧藍航線 發布:2025-01-25 06:15:22 瀏覽:650
如何打開sqlserver2008 發布:2025-01-25 06:12:33 瀏覽:994