Сделав некоторое прибегание к гуглу, кажется, что это невозможно, - Hibernate допускает включение псевдонима корневого объекта, используя {alias}
, в строку SQL SQLProjection
. Однако я обнаружил эту проблему, касающуюся ограничения на страницах Hibernate JIRA.
Кто-то любезно предоставил исправление, позволяющее использовать псевдонимы без полномочий root в строке 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);
Надеюсь, это поможет любому, кто столкнется с той же проблемой.