tags:

views:

121

answers:

1

Do Hibernate Projection aliases even work? I could swear it just doesn't. At least, it doesn't do what I would expect it to do.

Here is the java:

return sessionFactory.getCurrentSession().createCriteria( PersonProgramActivity.class ).setProjection(
        Projections.projectionList().add(
                Projections.alias( Projections.sum( "numberOfPoints" ), "number_of_points" ) ).add(
                Projections.groupProperty( "person.id" ) ) ).setFirstResult( start ).setFetchSize(
        size ).addOrder( Order.desc( "numberOfPoints" ) ).list();

Here is the SQL that it generates:

select sum(this_.number_of_points) as y0_, this_.person_id as y1_ from PERSON_PROGRAM_ACTIVITY this_ group by this_.person_id order by this_.number_of_points desc

It doesn't seem to use the alias at all. I would think setting the alias would mean that "sum(this_.number_of_points)" would be aliased as "number_of_points" and not "y0_". Is there some trick I am missing?

Thanks.

+1  A: 

You need to give the entire criteria an alias, then you can create other aliases that actually get used. What is strange is that the aliases get turned into y0_ instead of the other way around.

    return sessionFactory.getCurrentSession().createCriteria( PersonProgramActivity.class, "ppa" ).setProjection(
            Projections.projectionList().add(
                    Projections.alias( Projections.sum( "numberOfPoints" ), "ppa.numberOfPoints" ) ).add(
                    Projections.groupProperty( "person.id" ) ) ).setFirstResult( start ).setFetchSize( size )
            .addOrder( Order.desc( "ppa.numberOfPoints" ) ).list();

Generates the following SQL:

select sum(this_.number_of_points) as y0_, this_.person_id as y1_ from PERSON_PROGRAM_ACTIVITY this_ group by this_.person_id order by this_.y0_ desc
sbzoom
+1 i've seen this kind of thing as well, I think with subqueries.
Justin