Могу ли я сгруппировать по вложенной связанной сущности, используя проекции в спящем режиме? - PullRequest
0 голосов
/ 30 ноября 2010

Если у меня есть такие объекты, как:

@Entity
public class Person {
   public String name;
   @OneToMany
   public Location location;
}

@Entity
public class Location {
   public String address;
   public String city;
   public String state;
}

Скажем, я хочу подсчитать всех людей в каждом штате.Если я смогу сделать что-то вроде этого:

Criteria criteria = session.createCriteria(Person.class);
criteria.setProjection(Projections.projectionList().
   add(Projections.groupProperty("location.state")).
   add(Projections.count("name")));
List<Object[]> result = criteria.list();

Я знаю, что точный пример не сработает, потому что я получаю сообщение об ошибке, could not resolve property: location.state of of: Person.Есть ли способ сделать то, что я пытаюсь сделать, не прибегая к HQL?(Реальная версия этого запроса довольно динамична, поэтому программное построение критериев очень полезно.)

Ответы [ 2 ]

0 голосов
/ 01 декабря 2010

Сначала я создал игрушечный пример выше, так что вполне возможно, что игрушка сработала бы, и даже предложение Партенона могло бы сработать на примере игрушки.Документация, кажется, указывает, что любой из них должен, но он не работал в моем реальном сценарии, который слишком многословен, чтобы здесь углубляться.

Проблема в том, что не удалось найти свойство location.state.То, что в конечном итоге сработало, заключалось в явном создании псевдонимов в критериях:

criteria.createAlias("location", "location").createAlias("location.state", "state");

Я все еще не мог использовать псевдоним «state», но «location.state» тогда работал для меня, поэтому создание псевдонимов каким-то образомподготовил конструктор запросов, чтобы он мог найти его, когда раньше не мог.Все это кажется очень хакерским и не элегантным, поэтому я не горжусь этим решением, но это то, что сработало.Это звучит как ошибка для кого-то еще?

Для любопытных, не вдаваясь в общую модель сущности, вот фактические критерии и прогнозы, которые сработали для меня:

obsCriteria.createAlias("phenomenon", "phenomenon").createAlias(
  "phenomenon.phenomenonGroup", "phenomenonGroup");
ProjectionList projection = Projections.projectionList()
  .add(Projections.avg("value"))
  .add(Projections.groupProperty("phenomenon.phenomenonGroup"));
obsCriteria.setProjection(projection);
0 голосов
/ 30 ноября 2010

Вы можете создать Местоположение как ассоциацию для Персона, а затем сгруппировать его там.Например:

session.createCriteria(Person.class)
         .add(Projections.count("name"))
       .createCriteria(Location.class)
         .add(Projections.groupProperty("state"))

Не проверено, но должно работать :-)

...