Критерии гибернации с проекцией не возвращают сущность, на которой реализованы критерии - PullRequest
6 голосов
/ 29 сентября 2011

Я использую spring-hibernate и использую класс HibernateDAOSupport. У меня есть две таблицы, сопоставленные друг с другом способом «один ко многим». Я реализую следующие критерии

 DetachedCriteria criteria = getCriteria( "a" )
        .setProjection( Projections.projectionList()
                .add( Projections.groupProperty("a.id" ) )
                .add( Projections.count( "a.id" ), "count" )
                )
        .createCriteria( "huApps", "hu")
        .addOrder( Order.desc( "count" ) )
        ;

это хорошо работает и создайте следующий запрос

select
        this_.id as y0_,
        count(this_.id) as y1_ 
    from
        apps this_ 
    inner join
        huapps huapp1_ 
            on this_.id=huapp1_.appid 
    group by
        this_.id 
    order by
        y1_ desc

В результате возвращается список object[]. Но я хочу, чтобы он возвращал List<App> (App - это класс, для которого я реализовал / создал критерии). Я хочу, чтобы он создал запрос

select
 this_
    from
        apps this_ 
    inner join
        huapps huapp1_ 
            on this_.id=huapp1_.appid 
    group by
        this_.id 
    order by
        y1_ desc

Пожалуйста, помогите мне в написании правильных критериев. Я также попробовал с sqlProjection(), но даже это не сработало. Есть ли способ, которым я могу достичь этого?

Ответы [ 2 ]

2 голосов
/ 19 октября 2011

Попробуйте позвонить

DetachedCriteria criteria = getCriteria( "a" )
    .setProjection( Projections.projectionList()
    .add( Projections.groupProperty("a.id" ), "id" )
            .add( Projections.count( "a.id" ), "count" )
            )
    .createCriteria( "huApps", "hu")
    .addOrder( Order.desc( "count" ) )
    .setResultTransformer(Transformers.aliasToBean(App.class))

Это должно сопоставить псевдоним свойств с полями указанного вами компонента.Приложению понадобятся сеттеры и геттеры в соответствующих полях

1 голос
/ 30 сентября 2011

Вы пытаетесь добавить orger для новых критериев, являющихся результатом функции detachedCriteria.createCriteria("huApps", "hu").Эта функция возвращает новые критерии для класса свойства huApp.

Попробуйте заменить вас такими критериями, как:

DetachedCriteria detachedCriteria = DetachedCriteria.forClass(A.class);
detachedCriteria.setProjection(Projections.projectionList()
            .add(Projections.groupProperty("id"))
            .add(Projections.count("id"), "count")
    );

detachedCriteria.createCriteria("huApps", "hu");
detachedCriteria.addOrder(Order.desc("count"));

List<A> list = detachedCriteria.getExecutableCriteria(getSession()).list();

У меня это хорошо работает.

...