Hibernate поле нескольких псевдонимов - PullRequest
4 голосов
/ 13 февраля 2012

У меня есть объект, у которого есть поле коллекций (params). Там может быть много параметров. Я хочу сделать уникальное соединение для каждого уникального параметра. т.е. p1.id = ? AND p2.id = ? AND p3.id = ? и т. д.

В Hibernate, когда я пытаюсь создать псевдоним для того же поля, выдается исключение с сообщением о повторяющемся псевдониме.

Как мне получить несколько соединений для поля?

Я использую Spring Framework, Hibernate и Postgresql.

Заранее спасибо.

1 Ответ

2 голосов
/ 20 сентября 2012

Я предполагаю, что вы используете Criteria API.

Если вы проверите исходный код Hibernate, вы можете найти проблему здесь:

CriteriaQueryTranslator#createAssociationPathCriteriaMap()

private void createAssociationPathCriteriaMap() {
        Iterator iter = rootCriteria.iterateSubcriteria();
        while ( iter.hasNext() ) {
            CriteriaImpl.Subcriteria crit = ( CriteriaImpl.Subcriteria ) iter.next();
            String wholeAssociationPath = getWholeAssociationPath( crit );
            Object old = associationPathCriteriaMap.put( wholeAssociationPath, crit );
            if ( old != null ) {
                throw new QueryException( "duplicate association path: " + wholeAssociationPath );
            }
            int joinType = crit.getJoinType();
            old = associationPathJoinTypesMap.put( wholeAssociationPath, new Integer( joinType ) );
            if ( old != null ) {
                // TODO : not so sure this is needed...
                throw new QueryException( "duplicate association path: " + wholeAssociationPath );
            }
        }
    }

Я использую Hibernate 3.3.2.

Внутренне происходит следующее: когда вы добавляете Criteria s к своему корню Criteria Hibernate создает SubCriteria s, а затем заполняет Map (проверьте код ниже) всеми путями, которые вы пытаетесь использовать и если он найдет дублирование, он выдаст исключение.

Так, например, если вы пытаетесь присоединиться: entity0.entity1, а позже вы попытаетесь присоединиться к нему снова, вы получите Exception. Он не будет работать даже с псевдонимом, потому что Hibernate не заботится о них здесь.

Вы можете обойти это, если не присоединяетесь к чему-либо дважды ИЛИ не можете использовать HQL / JPQL. Вы можете проверить новые версии Hibernate, но я не уверен, исправили ли они эту квази-ошибку.

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