In Hibernate, there are three approaches to call a database store procedure.
1. Native SQL – createSQLQuery
You can use createSQLQuery() to call a store procedure directly.
1. Native SQL – createSQLQuery
You can use createSQLQuery() to call a store procedure directly.
Query query = session.createSQLQuery(
"CALL GetStocks(:stockCode)")
.addEntity(Stock.class)
.setParameter("stockCode", "7277");
List result = query.list();
for(int i=0; iStock stock = (Stock)result.get(i);
System.out.println(stock.getStockCode());
}
2. NamedNativeQuery in annotation
Declare your store procedure inside the @NamedNativeQueries annotation.
//Stock.java
...
@NamedNativeQueries({
@NamedNativeQuery(
name = "callStockStoreProcedure",
query = "CALL GetStocks(:stockCode)",
resultClass = Stock.class
)
})
@Entity
@Table(name = "stock")
public class Stock implements java.io.Serializable {
...
Call it with getNamedQuery().
Query query = session.getNamedQuery("callStockStoreProcedure")
.setParameter("stockCode", "7277");
List result = query.list();
for(int i=0; iStock stock = (Stock)result.get(i);
System.out.println(stock.getStockCode());
}
3. sql-query in XML mapping file
Declare your store procedure inside the “sql-query” tag.
<!-- Stock.hbm.xml -->
...
<hibernate-mapping>
<class name="com.mkyong.common.Stock" table="stock" ...>
<id name="stockId" type="java.lang.Integer">
<column name="STOCK_ID" />
<generator class="identity" />
</id>
<property name="stockCode" type="string">
<column name="STOCK_CODE" length="10" not-null="true" unique="true" />
</property>
...
</class>
<sql-query name="callStockStoreProcedure">
<return alias="stock" class="com.mkyong.common.Stock"/>
<![CDATA[CALL GetStocks(:stockCode)]]>
</sql-query>
</hibernate-mapping>
Call it with getNamedQuery().
Query query = session.getNamedQuery("callStockStoreProcedure")
.setParameter("stockCode", "7277");
List result = query.list();
for(int i=0; iStock stock = (Stock)result.get(i);
System.out.println(stock.getStockCode());
}
Conclusion
The above three approaches are doing the same thing, call a store procedure in database. There are not much big different between the three approaches, which method you choose is depend on your personal prefer.
Ref : link1
Supposing you have the following Oracle Stored procedure:
Invoking it from Hibernate requires mapping the Stored Procedure in the Person class.
Then, you can execute the procedure just like a normal Query:
Query query = session.getNamedQuery("SP_agenda");
List results = query.list();
CREATE FUNCTION agenda RETURN SYS_REFCURSOR
AS
my_cursor SYS_REFCURSOR;
BEGIN
OPEN my_cursor FOR
SELECT id,person_name,person_surname,person_address
FROM Person;
RETURN my_cursor;
END;
Invoking it from Hibernate requires mapping the Stored Procedure in the Person class.
<sql-query name="SP_agenda" callable="true">
<return alias="ev" class="Person">
<return-property name="id" column="id"/>
<return-property name="name" column="person_name"/>
<return-property name="surname" column="person_surname"/>
<return-property name="address" column="person_address"/>
</return>
{ ? = call agenda() }
</sql-query>
Then, you can execute the procedure just like a normal Query:
Query query = session.getNamedQuery("SP_agenda");
List results = query.list();
กาลามสูตร คือ พระสูตรที่พระพุทธเจ้าทรงแสดงแก่ชาวกาลามะ หมู่บ้านเกสปุตติยนิคม แคว้นโกศล (เรียกอีกอย่างว่า เกสปุตติยสูตร หรือเกสปุตตสูตร ก็มี[1]) กาลามสูตรเป็นหลักแห่งความเชื่อที่พระพุทธองค์ทรงวางไว้ให้แก่พุทธศาสนิกชน ไม่ให้เชื่อสิ่งใด ๆ อย่างงมงายโดยไม่ใช้ปัญญาพิจารณาให้เห็นจริงถึงคุณโทษหรือดีไม่ดีก่อนเชื่อ มีอยู่ 10 ประการ ได้แก่
- อย่าเพิ่งเชื่อตามที่ฟังๆ กันมา
- อย่าเพิ่งเชื่อตามที่ทำต่อๆ กันมา
- อย่าเพิ่งเชื่อตามคำเล่าลือ
- อย่าเพิ่งเชื่อโดยอ้างตำรา
- อย่าเพิ่งเชื่อโดยนึกเดา
- อย่าเพิ่งเชื่อโดยคาดคะเนเอา
- อย่าเพิ่งเชื่อโดยนึกคิดตามแนวเหตุผล
- อย่าเพิ่งเชื่อเพราะถูกกับทฤษฎีของตน
- อย่าเพิ่งเชื่อเพราะมีรูปลักษณ์ที่ควรเชื่อได้
- อย่าเพิ่งเชื่อเพราะผู้พูดเป็นครูบาอาจารย์ของตน
สมัครสมาชิก:
บทความ (Atom)