轉(zhuǎn)載,收藏一下!
?
http://terrencemail.javaeye.com/blog/197821
hibernate
存在如下表及關(guān)聯(lián):
- class ?House{ ??
- ?? private ?string?houseid; ??
- ?? private ?string?housename; ??
- } ??
- class ?Shelf{ ??
- ?? private ?string?shelfid; ??
- ?? private ?House?house; ??
- } ??
- class ?Position{ ??
- ?? private ?string?positionid; ??
- ?? private ?Shelf?shelf; ??
- } ??
- class ?Warehouse{ ??
- ?? private ?string?warehouseid; ??
- ?? private ?Position?position; ??
- }??
class House{ private string houseid; private string housename; } class Shelf{ private string shelfid; private House house; } class Position{ private string positionid; private Shelf shelf; } class Warehouse{ private string warehouseid; private Position position; }
Warehouse外鍵關(guān)聯(lián)Pisition, Position外鍵關(guān)聯(lián)Shelf, Shelf外鍵關(guān)聯(lián)houseid。
現(xiàn)在要對Warehouse使用Criteria查詢, 查詢House的id,可使用如下方法:
- Criteria?criteria?=?BaseUtil.getCriteria(Warehouse. class ); ??
- criteria.createAlias( "position" ,? "position" ); ??
- criteria.createAlias( "position.shelf" ,? "shelf" ); ??
- criteria.add(expression_r.eq( "shelf.house.houseid" ,? "111" ));??
Criteria criteria = BaseUtil.getCriteria(Warehouse.class); criteria.createAlias("position", "position"); criteria.createAlias("position.shelf", "shelf"); criteria.add(expression_r.eq("shelf.house.houseid", "111"));
如果要查詢House的name, 必須再關(guān)聯(lián)House表:
- Criteria?criteria?=?BaseUtil.getCriteria(Warehouse. class ); ??
- criteria.createAlias( "position" ,? "position" ); ??
- criteria.createAlias( "position.shelf" ,? "shelf" ); ??
- criteria.createAlias( "shelf.house" ,? "house" ); ??
- criteria.add(expression_r.eq( "house.housename" ,? "name?A" ));??
Criteria criteria = BaseUtil.getCriteria(Warehouse.class); criteria.createAlias("position", "position"); criteria.createAlias("position.shelf", "shelf"); criteria.createAlias("shelf.house", "house"); criteria.add(expression_r.eq("house.housename", "name A"));
以上代碼就可以實(shí)現(xiàn)了。
可是還會出現(xiàn)一個問題:如果表路徑position已經(jīng)被關(guān)聯(lián)過了(比如此criteria是傳入的參數(shù),已經(jīng)關(guān)聯(lián)了Alias路徑position, 并查詢過了),則會報(bào)錯。解決方法:
檢查criteria里面關(guān)聯(lián)的路徑,如果已經(jīng)關(guān)聯(lián),則不再關(guān)聯(lián),直接使用就行了。
- class ?CriteriaUtil{ ??
- public ? static ?Criteria?addAlias(CriteriaImpl?criteriaImpl,?String?path,?String?name){ ??
- ?? if (path?==? null )? return ?criteriaImpl; ??
- ?? for (Iterator?iter?=?criteriaImpl.iterateSubcriteria();iter.hasNext();){ ??
- ????Subcriteria?subCriteria?=?(Subcriteria)iter.next(); ??
- ???? if (path.equals(subCriteria.getPath())) ??
- ?????? return ?criteriaImpl; ??
- ??} ??
- ?? return ?criteriaImpl.createAlias(path,?name); ??
- } ??
- }??
class CriteriaUtil{ public static Criteria addAlias(CriteriaImpl criteriaImpl, String path, String name){ if(path == null) return criteriaImpl; for(Iterator iter = criteriaImpl.iterateSubcriteria();iter.hasNext();){ Subcriteria subCriteria = (Subcriteria)iter.next(); if(path.equals(subCriteria.getPath()))
(注:這段代碼有時是存在問題的,不是所有的Criteria 都能轉(zhuǎn)換為CriteriaImpl,可能會是Subcriteria。因此,需要確保傳入的參數(shù)為CriteriaImpl)
調(diào)用代碼就變成:
- Criteria?criteria?=?BaseUtil.getCriteria(Warehouse. class ); ??
- CriteriaUtil.addAlias((CriteriaImpl)criteria,? "position" ,? "position" ); ??
- CriteriaUtil.addAlias((CriteriaImpl)criteria,? "position.shelf" ,? "shelf" ); ??
-
criteria.add(expression_r.eq(
"shelf.house.houseid"
,?
"111"
));?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
