📄 customloader.java
字号:
//$Id: CustomLoader.java 10087 2006-07-06 12:21:30Z steve.ebersole@jboss.com $package org.hibernate.loader.custom;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.util.List;import java.util.Map;import java.util.Set;import java.util.ArrayList;import java.util.Iterator;import java.util.HashSet;import org.hibernate.HibernateException;import org.hibernate.LockMode;import org.hibernate.QueryException;import org.hibernate.ScrollableResults;import org.hibernate.engine.QueryParameters;import org.hibernate.engine.SessionFactoryImplementor;import org.hibernate.engine.SessionImplementor;import org.hibernate.hql.HolderInstantiator;import org.hibernate.loader.CollectionAliases;import org.hibernate.loader.EntityAliases;import org.hibernate.loader.Loader;import org.hibernate.persister.collection.CollectionPersister;import org.hibernate.persister.collection.QueryableCollection;import org.hibernate.persister.entity.Loadable;import org.hibernate.persister.entity.Queryable;import org.hibernate.transform.ResultTransformer;import org.hibernate.type.Type;import org.hibernate.type.TypeFactory;import org.hibernate.type.EntityType;import org.hibernate.type.CollectionType;import org.hibernate.util.ArrayHelper;/** * Extension point for loaders which use a SQL result set with "unexpected" column aliases. * * @author Gavin King * @author Steve Ebersole */public class CustomLoader extends Loader { // Currently *not* cachable if autodiscover types is in effect (e.g. "select * ...") private final String sql; private final Set querySpaces = new HashSet(); private final Map namedParameterBindPoints; private final Queryable[] entityPersisters; private final int[] entiytOwners; private final EntityAliases[] entityAliases; private final QueryableCollection[] collectionPersisters; private final int[] collectionOwners; private final CollectionAliases[] collectionAliases; private final LockMode[] lockModes;// private final String[] sqlAliases;// private final String[] sqlAliasSuffixes; private final ResultRowProcessor rowProcessor; // this is only needed (afaict) for processing results from the query cache; // however, this cannot possibly work in the case of discovered types... private Type[] resultTypes; // this is only needed (afaict) for ResultTransformer processing... private String[] transformerAliases; public CustomLoader(CustomQuery customQuery, SessionFactoryImplementor factory) { super( factory ); this.sql = customQuery.getSQL(); this.querySpaces.addAll( customQuery.getQuerySpaces() ); this.namedParameterBindPoints = customQuery.getNamedParameterBindPoints(); List entityPersisters = new ArrayList(); List entityOwners = new ArrayList(); List entityAliases = new ArrayList(); List collectionPersisters = new ArrayList(); List collectionOwners = new ArrayList(); List collectionAliases = new ArrayList(); List lockModes = new ArrayList(); List resultColumnProcessors = new ArrayList(); List nonScalarReturnList = new ArrayList(); List resultTypes = new ArrayList(); List specifiedAliases = new ArrayList(); int returnableCounter = 0; boolean hasScalars = false; Iterator itr = customQuery.getCustomQueryReturns().iterator(); while ( itr.hasNext() ) { final Return rtn = ( Return ) itr.next(); if ( rtn instanceof ScalarReturn ) { ScalarReturn scalarRtn = ( ScalarReturn ) rtn; resultTypes.add( scalarRtn.getType() ); specifiedAliases.add( scalarRtn.getColumnAlias() ); resultColumnProcessors.add( new ScalarResultColumnProcessor( scalarRtn.getColumnAlias(), scalarRtn.getType() ) ); hasScalars = true; } else if ( rtn instanceof RootReturn ) { RootReturn rootRtn = ( RootReturn ) rtn; Queryable persister = ( Queryable ) factory.getEntityPersister( rootRtn.getEntityName() ); entityPersisters.add( persister ); lockModes.add( rootRtn.getLockMode() ); resultColumnProcessors.add( new NonScalarResultColumnProcessor( returnableCounter++ ) ); nonScalarReturnList.add( rtn ); entityOwners.add( new Integer( -1 ) ); resultTypes.add( persister.getType() ); specifiedAliases.add( rootRtn.getAlias() ); entityAliases.add( rootRtn.getEntityAliases() ); ArrayHelper.addAll( querySpaces, persister.getQuerySpaces() ); } else if ( rtn instanceof CollectionReturn ) { CollectionReturn collRtn = ( CollectionReturn ) rtn; String role = collRtn.getOwnerEntityName() + "." + collRtn.getOwnerProperty(); QueryableCollection persister = ( QueryableCollection ) factory.getCollectionPersister( role ); collectionPersisters.add( persister ); lockModes.add( collRtn.getLockMode() ); resultColumnProcessors.add( new NonScalarResultColumnProcessor( returnableCounter++ ) ); nonScalarReturnList.add( rtn ); collectionOwners.add( new Integer( -1 ) ); resultTypes.add( persister.getType() ); specifiedAliases.add( collRtn.getAlias() ); collectionAliases.add( collRtn.getCollectionAliases() ); // determine if the collection elements are entities... Type elementType = persister.getElementType(); if ( elementType.isEntityType() ) { Queryable elementPersister = ( Queryable ) ( ( EntityType ) elementType ).getAssociatedJoinable( factory ); entityPersisters.add( elementPersister ); entityOwners.add( new Integer( -1 ) ); entityAliases.add( collRtn.getElementEntityAliases() ); ArrayHelper.addAll( querySpaces, elementPersister.getQuerySpaces() ); } } else if ( rtn instanceof EntityFetchReturn ) { EntityFetchReturn fetchRtn = ( EntityFetchReturn ) rtn; NonScalarReturn ownerDescriptor = fetchRtn.getOwner(); int ownerIndex = nonScalarReturnList.indexOf( ownerDescriptor ); entityOwners.add( new Integer( ownerIndex ) ); lockModes.add( fetchRtn.getLockMode() ); Queryable ownerPersister = determineAppropriateOwnerPersister( ownerDescriptor ); EntityType fetchedType = ( EntityType ) ownerPersister.getPropertyType( fetchRtn.getOwnerProperty() ); String entityName = fetchedType.getAssociatedEntityName( getFactory() ); Queryable persister = ( Queryable ) factory.getEntityPersister( entityName ); entityPersisters.add( persister ); nonScalarReturnList.add( rtn ); specifiedAliases.add( fetchRtn.getAlias() ); entityAliases.add( fetchRtn.getEntityAliases() ); ArrayHelper.addAll( querySpaces, persister.getQuerySpaces() ); } else if ( rtn instanceof CollectionFetchReturn ) { CollectionFetchReturn fetchRtn = ( CollectionFetchReturn ) rtn; NonScalarReturn ownerDescriptor = fetchRtn.getOwner(); int ownerIndex = nonScalarReturnList.indexOf( ownerDescriptor ); collectionOwners.add( new Integer( ownerIndex ) ); lockModes.add( fetchRtn.getLockMode() ); Queryable ownerPersister = determineAppropriateOwnerPersister( ownerDescriptor ); String role = ownerPersister.getEntityName() + '.' + fetchRtn.getOwnerProperty(); QueryableCollection persister = ( QueryableCollection ) factory.getCollectionPersister( role ); collectionPersisters.add( persister ); nonScalarReturnList.add( rtn ); specifiedAliases.add( fetchRtn.getAlias() ); collectionAliases.add( fetchRtn.getCollectionAliases() ); // determine if the collection elements are entities... Type elementType = persister.getElementType(); if ( elementType.isEntityType() ) { Queryable elementPersister = ( Queryable ) ( ( EntityType ) elementType ).getAssociatedJoinable( factory ); entityPersisters.add( elementPersister ); entityOwners.add( new Integer( ownerIndex ) ); entityAliases.add( fetchRtn.getElementEntityAliases() ); ArrayHelper.addAll( querySpaces, elementPersister.getQuerySpaces() ); } } else { throw new HibernateException( "unexpected custom query return type : " + rtn.getClass().getName() ); } } this.entityPersisters = new Queryable[ entityPersisters.size() ]; for ( int i = 0; i < entityPersisters.size(); i++ ) { this.entityPersisters[i] = ( Queryable ) entityPersisters.get( i ); } this.entiytOwners = ArrayHelper.toIntArray( entityOwners ); this.entityAliases = new EntityAliases[ entityAliases.size() ]; for ( int i = 0; i < entityAliases.size(); i++ ) { this.entityAliases[i] = ( EntityAliases ) entityAliases.get( i ); } this.collectionPersisters = new QueryableCollection[ collectionPersisters.size() ]; for ( int i = 0; i < collectionPersisters.size(); i++ ) { this.collectionPersisters[i] = ( QueryableCollection ) collectionPersisters.get( i ); } this.collectionOwners = ArrayHelper.toIntArray( collectionOwners ); this.collectionAliases = new CollectionAliases[ collectionAliases.size() ]; for ( int i = 0; i < collectionAliases.size(); i++ ) { this.collectionAliases[i] = ( CollectionAliases ) collectionAliases.get( i ); } this.lockModes = new LockMode[ lockModes.size() ]; for ( int i = 0; i < lockModes.size(); i++ ) { this.lockModes[i] = ( LockMode ) lockModes.get( i ); } this.resultTypes = ArrayHelper.toTypeArray( resultTypes ); this.transformerAliases = ArrayHelper.toStringArray( specifiedAliases ); this.rowProcessor = new ResultRowProcessor( hasScalars, ( ResultColumnProcessor[] ) resultColumnProcessors.toArray( new ResultColumnProcessor[ resultColumnProcessors.size() ] ) ); } private Queryable determineAppropriateOwnerPersister(NonScalarReturn ownerDescriptor) { String entityName = null; if ( ownerDescriptor instanceof RootReturn ) { entityName = ( ( RootReturn ) ownerDescriptor ).getEntityName(); } else if ( ownerDescriptor instanceof CollectionReturn ) { CollectionReturn collRtn = ( CollectionReturn ) ownerDescriptor; String role = collRtn.getOwnerEntityName() + "." + collRtn.getOwnerProperty(); CollectionPersister persister = getFactory().getCollectionPersister( role ); EntityType ownerType = ( EntityType ) persister.getElementType(); entityName = ownerType.getAssociatedEntityName( getFactory() ); } else if ( ownerDescriptor instanceof FetchReturn ) { FetchReturn fetchRtn = ( FetchReturn ) ownerDescriptor; Queryable persister = determineAppropriateOwnerPersister( fetchRtn.getOwner() ); Type ownerType = persister.getPropertyType( fetchRtn.getOwnerProperty() ); if ( ownerType.isEntityType() ) { entityName = ( ( EntityType ) ownerType ).getAssociatedEntityName( getFactory() ); } else if ( ownerType.isCollectionType() ) { Type ownerCollectionElementType = ( ( CollectionType ) ownerType ).getElementType( getFactory() ); if ( ownerCollectionElementType.isEntityType() ) { entityName = ( ( EntityType ) ownerCollectionElementType ).getAssociatedEntityName( getFactory() ); } } } if ( entityName == null ) { throw new HibernateException( "Could not determine fetch owner : " + ownerDescriptor ); } return ( Queryable ) getFactory().getEntityPersister( entityName ); } protected String getQueryIdentifier() { return sql; } protected String getSQLString() { return sql; } public Set getQuerySpaces() { return querySpaces; } protected LockMode[] getLockModes(Map lockModesMap) { return lockModes; } protected Loadable[] getEntityPersisters() { return entityPersisters; } protected CollectionPersister[] getCollectionPersisters() { return collectionPersisters; } protected int[] getCollectionOwners() { return collectionOwners; } protected int[] getOwners() { return entiytOwners;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -