Как вывести набор результатов объекта по групповым свойствам, используя Критерии Hibernate - PullRequest
0 голосов
/ 15 декабря 2011

Я ищу способ доставки Collection, java.util.map, объектов по свойствам их групп с использованием критериев гибернации в Spring.

Пример домена

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);

EDIT

В настоящее время я загружаю весь список MyDomain в классе Dao и инициализирую карту в классе обслуживания, которая выглядит следующим образом.

    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

1 Ответ

0 голосов
/ 15 декабря 2011

Метод 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...