如何使用Hibernate Criteria在组属性中拉取对象的结果集

时间:2011-12-15 11:06:34

标签: hibernate spring

我正在寻找一种方法来在Spring中使用hibernate标准在其组属性中提供对象的集合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);

修改

目前我正在Dao Class中加载MyDomain的完整列表,并在服务类中加载启动映射,看起来像。

    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;

我的努力是避免使用上面编写的代码并尝试在休眠状态下执行此操作。

提前致谢。 拉赫曼

1 个答案:

答案 0 :(得分:0)

groupProperty方法不会像你做的那样做。只有当您的查询使用聚合函数(sum,count等)聚合多个行时才有意义,并将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);
}