現在的系統中雖然使用了。Hibernate但是沒有使用Hibernate的關聯關系來進行數據庫操作。所有的管理操作都是單獨實現的。所以也不能用Criteria.add()這種方式去查詢關聯的一方。所以只能用Native SQL去查詢結果返回對象了。按照Hibernate3的reference里面說的
對原生SQL查詢執行的控制是通過SQLQuery接口進行的,通過執行Session.createSQLQuery()獲取這個接口。最簡單的情況下,我們可以采用以下形式:
List cats = sess.createSQLQuery("select * from cats")
.addEntity(Cat.class)
.list();
這個查詢指定了:
這里,結果集字段名被假設為與映射文件中指明的字段名相同。對于連接了多個表的查詢,這就可能造成問題,因為可能在多個表中出現同樣名字的字段。下面的方法就可以避免字段名重復的問題:
List cats = sess.createSQLQuery("select {cat.*} from cats cat")
.addEntity("cat", Cat.class)
.list();
這個查詢指定了:
addEntity()方法將SQL表的別名和實體類聯系起來,并且確定查詢結果集的形態。
addJoin()方法可以被用于載入其他的實體和集合的關聯.
List cats = sess.createSQLQuery(
"select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id"
)
.addEntity("cat", Cat.class)
.addJoin("kitten", "cat.kittens")
.list();
原生的SQL查詢可能返回一個簡單的標量值或者一個標量和實體的結合體。
Double max = (Double) sess.createSQLQuery("select max(cat.weight) as maxWeight from cats cat")
.addScalar("maxWeight", Hibernate.DOUBLE);
.uniqueResult();
除此之外,你還可以在你的hbm文件中描述結果集映射信息,在查詢中使用。
List cats = sess.createSQLQuery(
"select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id"
)
.setResultSetMapping("catAndKitten")
.list();
后來我使用了命名SQL查詢方式。
可以在映射文檔中定義查詢的名字,然后就可以象調用一個命名的HQL查詢一樣直接調用命名SQL查詢.在這種情況下,我們不 需要調用addEntity()方法.
<sql-query name="persons">
<return alias="person" class="eg.Person"/>
SELECT person.NAME AS {person.name},
person.AGE AS {person.age},
person.SEX AS {person.sex}
FROM PERSON person
WHERE person.NAME LIKE :namePattern
</sql-query>
List people = sess.getNamedQuery("persons")
.setString("namePattern", namePattern)
.setMaxResults(50)
.list();
我覺得這種發式比較好。這樣寫出來的sql可以很整齊。我們的數據庫使用的是oracle,不過按照這上面的寫法發現sql語句有錯誤。
后來拿到控制臺執行也抱錯。因為原來都用sqlserver,而sqlserver都是可以的。后來發現是表不能有別名改成這樣就好了。
????????????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);
????}