2011-12-15 30 views
0

我正在尋找一種方法來在Spring中使用hibernate條件沿着其組合屬性傳遞對象的Collection,java.util.map。如何使用休眠條件沿着組屬性拉對象的結果集

示例域

MyDomain { 

    private String x; 
    private String y; 
    private String pos; 
    //---Getters & Setters ---- 

} 

我喜歡具有

Map<String(X),Map<String(Y),List<MyDoamin>> 

集合。爲此,我使用分離標準。到目前爲止,我能夠組屬性,但我不知道如何在結果集中添加整個對象,我可以使用結果轉換器在Map中進行進一步轉換。

DetachedCriteria detachedCriteria = DetachedCriteria.forClass(MyDomain.class); 

    detachedCriteria 
       .setProjection(
           Projections.projectionList().add(Projections.groupProperty(X)) 
              .add(Projections.groupProperty(Y)) 
           ).addOrder(Order.asc(X)) 
           .addOrder(Order.asc(Y)) 



Object o = this.getHibernateTemplate().findByCriteria(detachedCriteria); 

編輯

目前我加載MYDOMAIN的整個列表中DAO類UND initlizing在看起來像服務類映射。

Map<String, Map<String,List<MyDomain>>> ret = 
       new HashMap<String, Map<String, List<MyDomain>>>>(); 
    try 
    { 

     List<MyDomain> myDomains = this.myDomainDao.findAll(); 
     Collections.sort(myDomains); 
     for (MyDomain myDomain : myDomains) 
     { 
      String x = myDomain.getX(); 
      String y = myDomain.getY(); 

      if (ret.get(x) == null) 
      { 

       ret.put(x, new HashMap<String,List<MyDomain>>()); 
      } 



      if (ret.get(x).get(y) == null) 
      { 
       ret.get(x).put(y, new ArrayList<MyDomain>()); 

      } 

      ret.get(x).get(y).add(myDomain); 

     } 

    } 
    catch (Exception e) 
    { 
     this.logger.warn(e); 
     this.logger.debug(e.getMessage()); 
    } 


    return ret; 

我的努力是爲了避免上面寫碼服務,並嘗試做它在休眠。

在此先感謝。 Rehman

回答

0

groupProperty方法不會做你認爲它做的。如果您的查詢使用聚合函數(總和,計數等)聚合多行,並且將group by子句應用於查詢,那麼這樣做纔有意義。

你需要的是純粹的Java代碼:

List<MyDomain> domains = // find the MyDomain entities you want 
Map<String, Map<String, List<MyDomain>>> domainsByXThenY = new HashMap<String, Map<String, List<MyDomain>>>(); 
for (MyDomain d : domains) { 
    String x = d.getX(); 
    Map<String, List<MyDomain>> mapForX = domainsByXThenY.get(x); 
    if (mapFoxX == null) { 
     mapForX = new HashMap<String, List<MyDomain>>(); 
     domainsByXThenY.put(x, mapForX); 
    } 
    String y = d.getY(); 
    List<MyDomain> listForY = mapForX.get(y); 
    if (listForY == null) { 
     listForY = new ArrayList<MyDomain>(); 
     mapForX.put(y, listForY); 
    } 
    listForY.add(d); 
} 
+0

燁,你是對的。目前我做的和你在文章中提到的一樣,但是我想也許這樣的功能已經在休眠標準中可用了。 – Rehman 2011-12-15 12:47:34