下面列出了org.hibernate.type.EntityType#getAssociatedJoinable ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
private static String[] determineRhsColumnNames(EntityType entityType, SessionFactoryImplementor sessionFactory) {
final Joinable persister = entityType.getAssociatedJoinable( sessionFactory );
return entityType.getRHSUniqueKeyPropertyName() == null ?
persister.getKeyColumnNames() :
( (PropertyMapping) persister ).toColumns( entityType.getRHSUniqueKeyPropertyName() );
}
public static MapKeyEntityFromElement buildKeyJoin(FromElement collectionFromElement) {
final HqlSqlWalker walker = collectionFromElement.getWalker();
final SessionFactoryHelper sfh = walker.getSessionFactoryHelper();
final SessionFactoryImplementor sf = sfh.getFactory();
final QueryableCollection collectionPersister = collectionFromElement.getQueryableCollection();
final Type indexType = collectionPersister.getIndexType();
if ( indexType == null ) {
throw new IllegalArgumentException( "Given collection is not indexed" );
}
if ( !indexType.isEntityType() ) {
throw new IllegalArgumentException( "Given collection does not have an entity index" );
}
final EntityType indexEntityType = (EntityType) indexType;
final EntityPersister indexEntityPersister = (EntityPersister) indexEntityType.getAssociatedJoinable( sf );
final String rhsAlias = walker.getAliasGenerator().createName( indexEntityPersister.getEntityName() );
final boolean useThetaJoin = collectionFromElement.getJoinSequence().isThetaStyle();
MapKeyEntityFromElement join = new MapKeyEntityFromElement( useThetaJoin );
join.initialize( HqlSqlTokenTypes.JOIN_FRAGMENT, ( (Joinable) indexEntityPersister ).getTableName() );
join.initialize( collectionFromElement.getWalker() );
join.initializeEntity(
collectionFromElement.getFromClause(),
indexEntityPersister.getEntityName(),
indexEntityPersister,
indexEntityType,
"<map-key-join-" + collectionFromElement.getClassAlias() + ">",
rhsAlias
);
// String[] joinColumns = determineJoinColuns( collectionPersister, joinTableAlias );
// todo : assumes columns, no formulas
String[] joinColumns = collectionPersister.getIndexColumnNames( collectionFromElement.getCollectionTableAlias() );
JoinSequence joinSequence = sfh.createJoinSequence(
useThetaJoin,
indexEntityType,
rhsAlias,
// todo : ever a time when INNER is appropriate?
//JoinType.LEFT_OUTER_JOIN,
// needs to be an inner join because of how JoinSequence/JoinFragment work - ugh
// JoinType.INNER_JOIN,
collectionFromElement.getJoinSequence().getFirstJoin().getJoinType(),
joinColumns
);
join.setJoinSequence( joinSequence );
join.setOrigin( collectionFromElement, true );
join.setColumns( joinColumns );
join.setUseFromFragment( collectionFromElement.useFromFragment() );
join.setUseWhereFragment( collectionFromElement.useWhereFragment() );
walker.addQuerySpaces( indexEntityPersister.getQuerySpaces() );
return join;
}