我有一个实体,它有collections字段(params)。可能有许多参数。我想为每个唯一的参数创建唯一的联接。即CCD_ 1等
在Hibernate中,当我尝试为同一字段创建别名时,它会抛出异常,并显示关于重复别名的消息。
如何实现字段的多个联接?
我使用的是spring框架、hibernate和postgresql。
提前谢谢。
我假设您正在使用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的新版本,但我不确定他们是否修复了这个准错误。