現(xiàn)在的系統(tǒng)中雖然使用了。Hibernate但是沒有使用Hibernate的關(guān)聯(lián)關(guān)系來進(jìn)行數(shù)據(jù)庫操作。所有的管理操作都是單獨(dú)實(shí)現(xiàn)的。所以也不能用Criteria.add()這種方式去查詢關(guān)聯(lián)的一方。所以只能用Native SQL去查詢結(jié)果返回對象了。按照Hibernate3的reference里面說的
對原生SQL查詢執(zhí)行的控制是通過SQLQuery接口進(jìn)行的,通過執(zhí)行Session.createSQLQuery()獲取這個接口。最簡單的情況下,我們可以采用以下形式:
List cats = sess.createSQLQuery("select * from cats")
.addEntity(Cat.class)
.list();
這個查詢指定了:
這里,結(jié)果集字段名被假設(shè)為與映射文件中指明的字段名相同。對于連接了多個表的查詢,這就可能造成問題,因?yàn)榭赡茉诙鄠€表中出現(xiàn)同樣名字的字段。下面的方法就可以避免字段名重復(fù)的問題:
List cats = sess.createSQLQuery("select {cat.*} from cats cat")
.addEntity("cat", Cat.class)
.list();
這個查詢指定了:
addEntity()方法將SQL表的別名和實(shí)體類聯(lián)系起來,并且確定查詢結(jié)果集的形態(tài)。
addJoin()方法可以被用于載入其他的實(shí)體和集合的關(guān)聯(lián).
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查詢可能返回一個簡單的標(biāo)量值或者一個標(biāo)量和實(shí)體的結(jié)合體。
Double max = (Double) sess.createSQLQuery("select max(cat.weight) as maxWeight from cats cat")
.addScalar("maxWeight", Hibernate.DOUBLE);
.uniqueResult();
除此之外,你還可以在你的hbm文件中描述結(jié)果集映射信息,在查詢中使用。
List cats = sess.createSQLQuery(
"select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id"
)
.setResultSetMapping("catAndKitten")
.list();
后來我使用了命名SQL查詢方式。
可以在映射文檔中定義查詢的名字,然后就可以象調(diào)用一個命名的HQL查詢一樣直接調(diào)用命名SQL查詢.在這種情況下,我們不 需要調(diào)用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();
我覺得這種發(fā)式比較好。這樣寫出來的sql可以很整齊。我們的數(shù)據(jù)庫使用的是oracle,不過按照這上面的寫法發(fā)現(xiàn)sql語句有錯誤。
后來拿到控制臺執(zhí)行也抱錯。因?yàn)樵瓉矶加胹qlserver,而sqlserver都是可以的。后來發(fā)現(xiàn)是表不能有別名改成這樣就好了。
????????????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
?
這里要特別的提醒一下大家千萬不要把主鍵忘了。剛開始我就忘了主鍵,后來調(diào)試了半天才找出原因來。
這樣在sping里面用回調(diào)查詢一下就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);
????}
posted on 2006-05-26 10:33
莫多 閱讀(3786)
評論(0) 編輯 收藏 所屬分類:
Spring 、
Hibernate