daybreaksnow's diary

私を私と呼びたい

[Hibernate]sqlProjection使用時はjoinしたエイリアス名を解決できない?

sqlRestricionであればルートエンティティ、子エンティティのどちらもエイリアス名を取得することができる(参考)が、sqlProjectionでは、どちらかしか取れない?

以下のコードでは子エンティティの方のプロジェクションしか有効にならない。
(setProjectionは上書きなのでルートの方が消えるのは当然なのだが。)

Criteria rootCriteria = session.createCriteria( Bid.class);
Criteria subCriteria = rootCriteria.createCriteria( "item", "aliasItem");
rootCriteria.setProjection( Projections.sqlProjection( "{alias}.bid_id as hoge", new String[] {"hoge"},new Type[] {Hibernate.BIG_INTEGER}));
subCriteria.setProjection( Projections.sqlProjection( "{alias}.name as piyo", new String[] {"piyo"}, new Type[] {Hibernate.STRING}));
result = rootCriteria.list();

発行されるSQL

Hibernate: select aliasitem1_.name as piyo from public.bid this_ inner join public.item aliasitem1_ on this_.item_id=aliasitem1_.item_id


stackoverflowを見ると、どうやらHibernateがサポートしていないらしく、パッチを作った人がいるそうだ。
http://stackoverflow.com/questions/7822662/referencing-outer-criteria-query-aliases-from-within-an-sqlprojection