Hibernate Criteria 多層次查詢關聯問題 HibernateJava

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. }  

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.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.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 == nullreturn 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. }  

(注:這段代碼有時是存在問題的,不是所有的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.eq("shelf.house.houseid""111"));  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章