關於Hibernate3的NativeSQL查詢是如此簡單

現在的系統中雖然使用了。Hibernate但是沒有使用Hibernate的關聯關係來進行數據庫操作。所有的管理操作都是單獨實現的。所以也不能用Criteria.add()這種方式去查詢關聯的一方。所以只能用Native SQL去查詢結果返回對象了。按照Hibernate3的reference裏面說的

16.1. 使用SQLQuery

對原生SQL查詢執行的控制是通過SQLQuery接口進行的,通過執行Session.createSQLQuery()獲取這個接口。最簡單的情況下,我們可以採用以下形式:

這個查詢指定了:

  • SQL查詢字符串

  • 查詢返回的實體

這裏,結果集字段名被假設爲與映射文件中指明的字段名相同。對於連接了多個表的查詢,這就可能造成問題,因爲可能在多個表中出現同樣名字的字段。下面的方法就可以避免字段名重複的問題:

這個查詢指定了:

  • SQL查詢語句,它帶一個佔位符,可以讓Hibernate使用字段的別名.

  • 查詢返回的實體,和它的SQL表的別名.

addEntity()方法將SQL表的別名和實體類聯繫起來,並且確定查詢結果集的形態。

addJoin()方法可以被用於載入其他的實體和集合的關聯.

原生的SQL查詢可能返回一個簡單的標量值或者一個標量和實體的結合體。

除此之外,你還可以在你的hbm文件中描述結果集映射信息,在查詢中使用。


後來我使用了命名SQL查詢方式。

16.3. 命名SQL查詢

可以在映射文檔中定義查詢的名字,然後就可以象調用一個命名的HQL查詢一樣直接調用命名SQL查詢.在這種情況下,我們 需要調用addEntity()方法.

            SELECT T_PAY.sys_id as {pay.sysId},
                   T_PAY.sys_flag 
as {pay.sysFlag},
                   T_PAY.sys_domain 
as {pay.sysDomain},
                   T_PAY.sys_owner 
as {pay.sysOwner},
                   T_PAY.sys_create_date 
as {pay.sysCreateDate},
                   T_PAY.sys_update_date 
as {pay.sysUpdateDate},
                   T_PAY.pay_id 
as {pay.payId},
                   T_PAY.pay_name 
as {pay.payName},
                   T_PAY.pay_type_id 
as {pay.payTypeId},
                   T_PAY.pay_date 
as {pay.payDate},
                   T_PAY.money_type_id 
as {pay.moneyTypeId},
                   T_PAY.amount 
as {pay.amount},
                   T_PAY.payer_id 
as {pay.payerId},
                   T_PAY.payer_name 
as {pay.payerName},
                   T_PAY.accept_id 
as {pay.acceptId},
                   T_PAY.accept_name 
as {pay.acceptName},
                   T_PAY.pay_state_id 
as {pay.payStateId},
                   T_PAY.remark 
as {pay.remark}
            
FROM   T_PAY
            
JOIN   T_BIZ_PAY
            
ON       T_PAY.pay_id = T_BIZ_PAY.pay_id
            
WHERE  T_BIZ_PAY.biz_id = :bizId
  這裏要特別的提醒一下大家千萬不要把主鍵忘了。剛開始我就忘了主鍵,後來調試了半天才找出原因來。

這樣在sping裏面用回調查詢一下就ok了。真的很方便.
    public List getPaysByBizId(final String bizId) {
        
return (List)getHibernateTemplate().execute(new HibernateCallback(){
            
public Object doInHibernate(Session session)throws HibernateException{
                Query query 
= session.getNamedQuery("find.pays.by.bizid");
                query.setParameter(
"bizId",bizId);
                
return query.list();
            }
        },
true);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章