开发者

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?


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.


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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜