眾所周知,當過多的使用存儲過程,觸發器等 數據庫方言相關的應用時,應用程序的移植性會變差,特別是在Hibernate中使用這些,簡直是諷刺,但是當今中國又有哪家公司做項目會關心應用程序的移植性呢?
現在看看Hibernate中對Oracle存儲過程的調用.
1.plsql 代碼

create Procedure proc() begin select * from proctab; end;
1 create procedure proc1(v_no number(4)) 2 begin 3 select * from proc1 4 where id=v_no; 5 end;
2.Hibernate 存儲過程調用的一種方法是,通過XML傳統的映射方式去調用。
-》存儲過程映射和領域模型中的實體的對應關系

1 <class name="com.test.User" table="proctab"> 2 <id name="id" column="id"> 3 <generator class="native"/> 4 </id> 5 <property name="name" column="name" type="string" /> 6 <property name="age" column="age" type="integer" /> 7 </class> 8 <sql-query name="getUser" callable="true"> 9 <return alias="user" class="com.test.User"> 10 <return-property name="id" column="id" /> 11 <return-property name="name" column="name" /> 12 <return-property name="age" column="age" /> 13 </return> 14 {call proc()} 15 </sql-query>
-》Hibernate API 對存儲過程的調用

1 Session ss= HibernateSessionFactory.getSession() 2 List li=ss.getNamedQuery("getUser").list(); 3 ss.close(); 4 5 Session ss= HibernateSessionFactory.getSession() 6 List li=ss.getNamedQuery("getUser").list(); 7 ss.close();
-》JDBC API 對存儲過程的調用

1 Session session =HibernateSessionFactory.getSession(); 2 Connection conn = session.connection(); 3 ResultSet rs =null; 4 CallableStatement call = conn.prepareCall("{Call proc()}"); 5 rs = call.executeQuery(); 6 rs.close(); 7 session.close(); 8 9 Session session =HibernateSessionFactory.getSession(); 10 Connection conn = session.connection(); 11 ResultSet rs =null; 12 CallableStatement call = conn.prepareCall("{Call proc()}"); 13 rs = call.executeQuery(); 14 rs.close(); 15 session.close();
-》直接使用 Hibernate createQuerySql調用存儲過程

1 Session session =HibernateSessionFactory.getSession(); 2 SQLQuery query = session.createSQLQuery("{Call proc()}"); 3 List list =query.list(); 4 session.close(); 5 6 Session session =HibernateSessionFactory.getSession(); 7 SQLQuery query = session.createSQLQuery("{Call proc()}"); 8 List list =query.list(); 9 session.close();
-》通過Hibernate API或者JDBC,API給存儲過程傳參

1 CallableStatement call = conn.prepareCall("{Call proc(?)}"); 2 call.setString(1, 參數); 3 rs = call.executeQuery(); 4 5 CallableStatement call = conn.prepareCall("{Call proc(?)}"); 6 call.setString(1, 參數); 7 rs = call.executeQuery();

1 SQLQuery query = session.createSQLQuery("{Call proc(?)}"); 2 query.setString(0, 參數); 3 List list =query.list();