Ссылка на псевдонимы запроса внешних критериев из SQLProjection - PullRequest
12 голосов
/ 19 октября 2011

Мне известно, что вы можете использовать {alias} для ссылки на корневую сущность в SQLProjection:

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

Я пытаюсь сослаться на псевдоним для неroot entity:

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

, где i - псевдоним из запроса внешних критериев.Приведенный выше код вызывает исключение SQL о том, что i.powerRestarts не может быть найдено.

Можно ли ссылаться на псевдоним без полномочий root из SQLProjection?

1 Ответ

14 голосов
/ 20 октября 2011

Сделав некоторое прибегание к гуглу, кажется, что это невозможно, - 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);

Надеюсь, это поможет любому, кто столкнется с той же проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...