12

{alias}SQLProjection 内のルート エンティティを参照するために使用できることは承知しています。

Projections.sqlProjection("MIN({alias}.field) as value", new String[]{"value"}, new Type[]{new LongType()}))

私がやろうとしているのは、ルート以外のエンティティのエイリアスを参照することです:

Projections.sqlProjection("MIN(i.powerRestarts) as value", new String[]{"value"}, new Type[]{new LongType()}))

whereiは、外部条件クエリからのエイリアスです。上記のコードは、i.powerRestarts見つからないことを示す SQL 例外をスローします。

SQLProjection から非ルート エイリアスを参照することは可能ですか?

4

1 に答える 1

15

いくつかのグーグルを行った後、これは不可能であるように見えます-Hibernateは{alias}、のSQL文字列で使用するルートエンティティエイリアスのみを含めることができますSQLProjection。ただし、HibernateJIRAページの制限に関してこの問題を見つけました。

SQLProjection誰かが、新しいRestrictionsExtクラスを介して、文字列で非ルートエイリアスを使用できるようにするパッチを提出してくれました。質問からの私の例を使用して:

Projections.sqlProjection("MIN(i.powerRestarts) as value", new String[]{"value"}, new Type[]{new LongType()}))

エイリアスiは次のように参照できるようになりました。

RestrictionsExt.sqlProjection("MIN({i}.powerRestarts) as value", "value", new LongType())

パッチではこれが許可されず、デフォルトで。に設定されていたため、静的RestrictionsExt.sqlProjectionメソッドを変更して、列エイリアス("value")(ここでは)の型を指定できるようにする必要がありました。LongTypeStringType

パッチのSQLAliasedProjectionクラスには、org.hibernate.loader.criteria.CriteriaQueryTranslatorgetOuterQueryTranslatorおよび。の次のプライベートメソッドへのアクセスも必要ですgetAliasedCriteria。Hibernateソースを変更せずにこれを機能させるために、リフレクションを使用しました。

cri = ((org.hibernate.loader.criteria.CriteriaQueryTranslator) criteriaQuery).getAliasedCriteria(alias);

に変更されました:

Method m = ((org.hibernate.loader.criteria.CriteriaQueryTranslator) criteriaQuery).getClass().getDeclaredMethod("getAliasedCriteria", String.class);
m.setAccessible(true);
cri = (Criteria) m.invoke(((org.hibernate.loader.criteria.CriteriaQueryTranslator) criteriaQuery), alias);

うまくいけば、これは同じ問題に直面している他の人を助けるでしょう。

于 2011-10-20T07:41:22.660 に答える