轉載,收藏一下!
?
http://terrencemail.javaeye.com/blog/197821
hibernate
存在如下表及關聯:
- 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外鍵關聯Pisition, Position外鍵關聯Shelf, Shelf外鍵關聯houseid。
現在要對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, 必須再關聯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"));
以上代碼就可以實現了。
可是還會出現一個問題:如果表路徑position已經被關聯過了(比如此criteria是傳入的參數,已經關聯了Alias路徑position, 并查詢過了),則會報錯。解決方法:
檢查criteria里面關聯的路徑,如果已經關聯,則不再關聯,直接使用就行了。
- 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 都能轉換為CriteriaImpl,可能會是Subcriteria。因此,需要確保傳入的參數為CriteriaImpl)
調用代碼就變成:
- 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"
));?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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