多層次查詢關聯問題(轉)"alt="復制代碼"src="http://img.it610.com/image/product/81c56edbb6ee41769243cc4d4229b754.gif"width="1"height="1"/>classHouse{privatestr" />

黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

Hibernate Criteria 多層次查詢關聯問題

系統 1902 0

轉載,收藏一下!

?

http://terrencemail.javaeye.com/blog/197821

hibernate 存在如下表及關聯:

Java代碼 復制代碼
  1. class ?House{ ??
  2. ?? private ?string?houseid; ??
  3. ?? private ?string?housename; ??
  4. } ??
  5. class ?Shelf{ ??
  6. ?? private ?string?shelfid; ??
  7. ?? private ?House?house; ??
  8. } ??
  9. class ?Position{ ??
  10. ?? private ?string?positionid; ??
  11. ?? private ?Shelf?shelf; ??
  12. } ??
  13. class ?Warehouse{ ??
  14. ?? private ?string?warehouseid; ??
  15. ?? private ?Position?position; ??
  16. }??
    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,可使用如下方法:

Java代碼 復制代碼
  1. Criteria?criteria?=?BaseUtil.getCriteria(Warehouse. class ); ??
  2. criteria.createAlias( "position" ,? "position" ); ??
  3. criteria.createAlias( "position.shelf" ,? "shelf" ); ??
  4. 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表:

Java代碼 復制代碼
  1. Criteria?criteria?=?BaseUtil.getCriteria(Warehouse. class ); ??
  2. criteria.createAlias( "position" ,? "position" ); ??
  3. criteria.createAlias( "position.shelf" ,? "shelf" ); ??
  4. criteria.createAlias( "shelf.house" ,? "house" ); ??
  5. 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里面關聯的路徑,如果已經關聯,則不再關聯,直接使用就行了。

Java代碼 復制代碼
  1. class ?CriteriaUtil{ ??
  2. public ? static ?Criteria?addAlias(CriteriaImpl?criteriaImpl,?String?path,?String?name){ ??
  3. ?? if (path?==? null )? return ?criteriaImpl; ??
  4. ?? for (Iterator?iter?=?criteriaImpl.iterateSubcriteria();iter.hasNext();){ ??
  5. ????Subcriteria?subCriteria?=?(Subcriteria)iter.next(); ??
  6. ???? if (path.equals(subCriteria.getPath())) ??
  7. ?????? return ?criteriaImpl; ??
  8. ??} ??
  9. ?? return ?criteriaImpl.createAlias(path,?name); ??
  10. } ??
  11. }??
    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)

調用代碼就變成:

Java代碼 復制代碼
  1. Criteria?criteria?=?BaseUtil.getCriteria(Warehouse. class ); ??
  2. CriteriaUtil.addAlias((CriteriaImpl)criteria,? "position" ,? "position" ); ??
  3. CriteriaUtil.addAlias((CriteriaImpl)criteria,? "position.shelf" ,? "shelf" ); ??
  4. criteria.add(expression_r.eq( "shelf.house.houseid" ,? "111" ));?

Hibernate Criteria 多層次查詢關聯問題


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論