группа критериев спящего режима по подсвойству

предполагая следующее:

public class Enterprise
{
   private int id;
   private String name;
}
public class Site
{
   private int id;
   private String name;
   private Enterprise enterprise; //@ManyToOne relation
}
public class Area
{
   private int id;
   private String name;
   private Site site; //@ManyToOne relation
}

Я хотел бы выполнить запрос, используя результат группировки критериев гибернации по предприятию.

    Criteria criteria = session.createCriteria(Area.class);
    criteria.setProjection(Projections.projectionList()  
                    .add(Property.forName("id").as("id")) 
                    .add(Property.forName("name").as("name"))
        .add(Projections.groupProperty("site.enterprise")))
        .setResultTransformer(Transformers.aliasToBean(Area.class));
/*
 * more conditions
 */
    List<Area> areas = criteria.list();

При выполнении этого спящего режима возвращается исключение: org.hibernate.QueryException: не удалось разрешить свойство: site.enterprise...

Есть ли какой-нибудь элегантный способ, как это сделать. Заранее спасибо.


person stebetko    schedule 07.01.2013    source источник


Ответы (1)


Возможно, вам сначала потребуется установить псевдоним:

criteria.createAlias("site", "s")

А затем используйте:

Projections.groupProperty("s.enterprise")

Вам также может понадобиться сгруппировать по полю, а не по объекту, поэтому:

site.enterprise.name // or id

Это может потребовать от вас также создания псевдонима для enterprise, но вам это может и не понадобиться.

ОБНОВЛЕНИЕ 1: вы можете получить что-то вроде этого:

Criteria criteria = session.createCriteria(Area.class);
criteria.createAlias("site", "s")
        .createAlias("s.enterprise", "e")
        .setProjection(Projections.projectionList()  
                .add(Property.forName("id").as("id")) 
                .add(Property.forName("name").as("name"))
    .add(Projections.groupProperty("s.e.name")))
    .setResultTransformer(Transformers.aliasToBean(Area.class));

ОБНОВЛЕНИЕ 2. Назовите меня сумасшедшим, но, судя по приведенному выше примеру, вы можете использовать очень многословный подход, не используя Hibernate в полной мере — кажется, что вы пытаетесь использовать его так, как хотите. будет SQL. Hibernate уже знает о ваших сущностях, их полях и отношениях. На мой взгляд, это эквивалентно приведенному выше:

Criteria criteria = session.createCriteria(Area.class);
criteria.createAlias("site", "s")
        .createAlias("s.enterprise", "e")
        .add(Projections.groupProperty("s.e.name"));

// Any other conditions.

List<Area> areas = criteria.list();

Я даже не уверен, почему вы группируете это в данный момент...

person Tony Day    schedule 07.01.2013
comment
Привет Тони! Это работает отлично. Я бы пометил ваш ответ как полезный, но у меня недостаточно репутации :) Спасибо. - person stebetko; 07.01.2013
comment
Рад, что это работает! Вы можете принять ответ, нажав на галочку под кнопками голосования. - person Tony Day; 07.01.2013
comment
.add(Projections.groupProperty("s.e.name")) как вы преобразовали PropertyProjection в Criterion здесь?? - person Madushan Perera; 12.02.2016