如何使用Hibernate条件沿组属性提取对象的结果集

如何使用Hibernate条件沿组属性提取对象的结果集,hibernate,spring,Hibernate,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>> 编辑

我正在寻找一种在春季使用hibernate标准交付对象集合java.util.map及其组属性的方法

示例域

MyDomain {

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

 }
我喜欢收藏

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

目前我正在Dao类中加载MyDomain的整个列表,并在服务类中初始化映射,如下所示

Map-ret=
新HashMap>();
尝试
{
List myDomains=this.myDomainDao.findAll();
Collections.sort(myDomains);
用于(MyDomain MyDomain:myDomains)
{
字符串x=myDomain.getX();
字符串y=myDomain.getY();
if(ret.get(x)=null)
{
ret.put(x,newhashmap());
}
if(ret.get(x).get(y)==null)
{
ret.get(x.put(y,newarraylist());
}
ret.get(x).get(y).add(myDomain);
}
}
捕获(例外e)
{
此.logger.warn(e);
this.logger.debug(e.getMessage());
}
返回ret;
我的努力是避免在服务中编写上述代码,并尝试在hibernate中执行

提前谢谢。
Rehman

方法的
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);
}
List domains=//查找所需的MyDomain实体
Map domainsbyxteny=新HashMap();
对于(MyDomain d:域){
字符串x=d.getX();
Map mapForX=domainsbyxtenny.get(x);
如果(mapFoxX==null){
mapForX=新的HashMap();
域byxtheny.put(x,mapForX);
}
字符串y=d.getY();
List listForY=mapForX.get(y);
if(listForY==null){
listForY=newarraylist();
mapForX.put(y,listForY);
}
添加(d);
}

是的,你是对的。目前,我正在做与您在文章中提到的相同的事情,但我在想,也许hibernate标准中已经提供了这样的功能。
    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;
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);
}