Критерий гибернации Псевдоним проекции не используется - PullRequest
6 голосов
/ 19 мая 2010

Псевдонимы Hibernate Projection даже работают? Я могу поклясться, что просто нет. По крайней мере, он не делает то, что я ожидал.

Вот 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();

Вот 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_.number_of_points desc

Кажется, псевдоним вообще не используется. Я думаю, установка псевдонима будет означать, что sum(this_.number_of_points) будет иметь псевдоним как number_of_points, а не y0_. Есть какой-то трюк, которого мне не хватает?

Спасибо.

Ответы [ 2 ]

6 голосов
/ 20 мая 2010

Вам нужно дать псевдоним всем критериям, затем вы можете создать другие псевдонимы, которые фактически используются. Что странно, так это то, что псевдонимы превращаются в y0_, а не наоборот.

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

Создает следующий 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
1 голос
/ 17 марта 2012

Запрос должен быть

return sessionFactory.getCurrentSession()
    .createCriteria( PersonProgramActivity.class, "ppa" )
    .setProjection(Projections.projectionList()
        .add( Projections.alias( Projections.sum( **"ppa.numberOfPoints"** ), **"numberOfPoints"** ) )
        .add( Projections.groupProperty( "person.id" ) ) )
    .setFirstResult( start )
    .setFetchSize( size )
    .addOrder( Order.desc( "ppa.numberOfPoints" ) )
    .list();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...