16.1. 使用SQLQuery
對原生SQL查詢執行的控制是通過SQLQuery接口進行的,通過執行Session.createSQLQuery()獲取這個接口。最簡單的情況下,我們可以採用以下形式:
這個查詢指定了:
SQL查詢字符串
查詢返回的實體
這裏,結果集字段名被假設爲與映射文件中指明的字段名相同。對於連接了多個表的查詢,這就可能造成問題,因爲可能在多個表中出現同樣名字的字段。下面的方法就可以避免字段名重複的問題:
這個查詢指定了:
SQL查詢語句,它帶一個佔位符,可以讓Hibernate使用字段的別名.
查詢返回的實體,和它的SQL表的別名.
addEntity()方法將SQL表的別名和實體類聯繫起來,並且確定查詢結果集的形態。
addJoin()方法可以被用於載入其他的實體和集合的關聯.
原生的SQL查詢可能返回一個簡單的標量值或者一個標量和實體的結合體。
除此之外,你還可以在你的hbm文件中描述結果集映射信息,在查詢中使用。
後來我使用了命名SQL查詢方式。
16.3. 命名SQL查詢
可以在映射文檔中定義查詢的名字,然後就可以象調用一個命名的HQL查詢一樣直接調用命名SQL查詢.在這種情況下,我們不 需要調用addEntity()方法.
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了。真的很方便.
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);
}