Я предполагаю, что вы используете 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, но я не уверен, исправили ли они эту квази-ошибку.