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
精彩评论