做了一些Google搜索後,看起來這是不可能的 - Hibernate只允許在SQLProjection
的SQL字符串中使用{alias}
包含根實體別名。然而,我在Hibernate JIRA頁面上找到了this issue regarding the limitation。
有人親切地提交了一個補丁,允許在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);
希望這將有助於其他人面臨同樣的問題。