2011-12-15 36 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