⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 customloader.java

📁 一个Java持久层类库
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
//$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 + -