いくつかのグーグルを行った後、これは不可能であるように見えます-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"
)(ここでは)の型を指定できるようにする必要がありました。LongType
StringType
パッチのSQLAliasedProjectionクラスには、org.hibernate.loader.criteria.CriteriaQueryTranslator
:getOuterQueryTranslator
および。の次のプライベートメソッドへのアクセスも必要です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);
うまくいけば、これは同じ問題に直面している他の人を助けるでしょう。