Rites
Rites

Reputation: 2342

Hibernate criteria with projection doesn't return the entity on which criteria is implemented

I'm using spring-hibernate and using HibernateDAOSupport class. I have two tables mapped to each other in one-to-many fashion. I'm implementing the below criteria

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

this works well and create the below query

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

In result, it returns a list of object[]. But I want that it should return List<App>(App is the class on which I implemented/created the criteria). I want that it would create the query

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

Please help me in writing the correct criteria. I also tried with sqlProjection() but even that didn't work. Is there any way I can achieve this?

Upvotes: 6

Views: 5781

Answers (2)

nik3daz
nik3daz

Reputation: 111

Try calling

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

This should map the properties alias to the fields of the bean that you specify. App will need setters and getters on the appropriate fields

Upvotes: 1

Yappie
Yappie

Reputation: 399

You try to add orger for new critheria that is result of function detachedCriteria.createCriteria("huApps", "hu"). This function return the new criteria for class of huApp property.

Try to replace you criteria like this:

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

It works well for me.

Upvotes: 1

Related Questions