質問

私はあなたが使用できることを知っています {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()}))

どこ i 外側の基準クエリのエイリアスです。上記のコードは、SQL例外をスローします i.powerRestarts 見つからない。

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

役に立ちましたか?

解決

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

誰かが親切に、ルート以外のエイリアスを使用できるパッチを提出しました 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: getOuterQueryTranslatorgetAliasedCriteria. 。 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);

うまくいけば、これが同じ問題に直面している他の人に役立つことを願っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top