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

📄 queryloader.java

📁 一个Java持久层类库
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
// $Id: QueryLoader.java 11116 2007-01-30 14:30:55Z steve.ebersole@jboss.com $package org.hibernate.loader.hql;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import org.hibernate.HibernateException;import org.hibernate.LockMode;import org.hibernate.QueryException;import org.hibernate.ScrollableResults;import org.hibernate.dialect.Dialect;import org.hibernate.engine.QueryParameters;import org.hibernate.engine.SessionFactoryImplementor;import org.hibernate.engine.SessionImplementor;import org.hibernate.event.EventSource;import org.hibernate.exception.JDBCExceptionHelper;import org.hibernate.hql.HolderInstantiator;import org.hibernate.hql.ast.QueryTranslatorImpl;import org.hibernate.hql.ast.tree.FromElement;import org.hibernate.hql.ast.tree.SelectClause;import org.hibernate.hql.ast.tree.QueryNode;import org.hibernate.impl.IteratorImpl;import org.hibernate.loader.BasicLoader;import org.hibernate.param.ParameterSpecification;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.persister.entity.Lockable;import org.hibernate.transform.ResultTransformer;import org.hibernate.type.EntityType;import org.hibernate.type.Type;import org.hibernate.util.ArrayHelper;/** * A delegate that implements the Loader part of QueryTranslator. * * @author josh */public class QueryLoader extends BasicLoader {	/**	 * The query translator that is delegating to this object.	 */	private QueryTranslatorImpl queryTranslator;	private Queryable[] entityPersisters;	private String[] entityAliases;	private String[] sqlAliases;	private String[] sqlAliasSuffixes;	private boolean[] includeInSelect;	private String[] collectionSuffixes;	private boolean hasScalars;	private String[][] scalarColumnNames;	//private Type[] sqlResultTypes;	private Type[] queryReturnTypes;	private final Map sqlAliasByEntityAlias = new HashMap(8);	private EntityType[] ownerAssociationTypes;	private int[] owners;	private boolean[] entityEagerPropertyFetches;	private int[] collectionOwners;	private QueryableCollection[] collectionPersisters;	private int selectLength;	private ResultTransformer selectNewTransformer;	private String[] queryReturnAliases;	private LockMode[] defaultLockModes;	/**	 * Creates a new Loader implementation.	 *	 * @param queryTranslator The query translator that is the delegator.	 * @param factory The factory from which this loader is being created.	 * @param selectClause The AST representing the select clause for loading.	 */	public QueryLoader(			final QueryTranslatorImpl queryTranslator,	        final SessionFactoryImplementor factory,	        final SelectClause selectClause) {		super( factory );		this.queryTranslator = queryTranslator;		initialize( selectClause );		postInstantiate();	}	private void initialize(SelectClause selectClause) {		List fromElementList = selectClause.getFromElementsForLoad();		hasScalars = selectClause.isScalarSelect();		scalarColumnNames = selectClause.getColumnNames();		//sqlResultTypes = selectClause.getSqlResultTypes();		queryReturnTypes = selectClause.getQueryReturnTypes();		selectNewTransformer = HolderInstantiator.createSelectNewTransformer(				selectClause.getConstructor(),				selectClause.isMap(),				selectClause.isList());		queryReturnAliases = selectClause.getQueryReturnAliases();		List collectionFromElements = selectClause.getCollectionFromElements();		if ( collectionFromElements != null && collectionFromElements.size()!=0 ) {			int length = collectionFromElements.size();			collectionPersisters = new QueryableCollection[length];			collectionOwners = new int[length];			collectionSuffixes = new String[length];			for ( int i=0; i<length; i++ ) {				FromElement collectionFromElement = (FromElement) collectionFromElements.get(i);				collectionPersisters[i] = collectionFromElement.getQueryableCollection();				collectionOwners[i] = fromElementList.indexOf( collectionFromElement.getOrigin() );//				collectionSuffixes[i] = collectionFromElement.getColumnAliasSuffix();//				collectionSuffixes[i] = Integer.toString( i ) + "_";				collectionSuffixes[i] = collectionFromElement.getCollectionSuffix();			}		}		int size = fromElementList.size();		entityPersisters = new Queryable[size];		entityEagerPropertyFetches = new boolean[size];		entityAliases = new String[size];		sqlAliases = new String[size];		sqlAliasSuffixes = new String[size];		includeInSelect = new boolean[size];		owners = new int[size];		ownerAssociationTypes = new EntityType[size];		for ( int i = 0; i < size; i++ ) {			final FromElement element = ( FromElement ) fromElementList.get( i );			entityPersisters[i] = ( Queryable ) element.getEntityPersister();			if ( entityPersisters[i] == null ) {				throw new IllegalStateException( "No entity persister for " + element.toString() );			}			entityEagerPropertyFetches[i] = element.isAllPropertyFetch();			sqlAliases[i] = element.getTableAlias();			entityAliases[i] = element.getClassAlias();			sqlAliasByEntityAlias.put( entityAliases[i], sqlAliases[i] );			// TODO should we just collect these like with the collections above?			sqlAliasSuffixes[i] = ( size == 1 ) ? "" : Integer.toString( i ) + "_";//			sqlAliasSuffixes[i] = element.getColumnAliasSuffix();			includeInSelect[i] = !element.isFetch();			if ( includeInSelect[i] ) {				selectLength++;			}			owners[i] = -1; //by default			if ( element.isFetch() ) {				if ( element.isCollectionJoin() || element.getQueryableCollection() != null ) {					// This is now handled earlier in this method.				}				else if ( element.getDataType().isEntityType() ) {					EntityType entityType = ( EntityType ) element.getDataType();					if ( entityType.isOneToOne() ) {						owners[i] = fromElementList.indexOf( element.getOrigin() );					}					ownerAssociationTypes[i] = entityType;				}			}		}		//NONE, because its the requested lock mode, not the actual! 		defaultLockModes = ArrayHelper.fillArray(LockMode.NONE, size);	}	// -- Loader implementation --	public final void validateScrollability() throws HibernateException {		queryTranslator.validateScrollability();	}	protected boolean needsFetchingScroll() {		return queryTranslator.containsCollectionFetches();	}	public Loadable[] getEntityPersisters() {		return entityPersisters;	}	public String[] getAliases() {		return sqlAliases;	}	public String[] getSqlAliasSuffixes() {		return sqlAliasSuffixes;	}	public String[] getSuffixes() {		return getSqlAliasSuffixes();	}	public String[] getCollectionSuffixes() {		return collectionSuffixes;	}	protected String getQueryIdentifier() {		return queryTranslator.getQueryIdentifier();	}	/**	 * The SQL query string to be called.	 */	protected String getSQLString() {		return queryTranslator.getSQLString();	}	/**	 * An (optional) persister for a collection to be initialized; only collection loaders	 * return a non-null value	 */	protected CollectionPersister[] getCollectionPersisters() {		return collectionPersisters;	}	protected int[] getCollectionOwners() {		return collectionOwners;	}	protected boolean[] getEntityEagerPropertyFetches() {		return entityEagerPropertyFetches;	}	/**	 * An array of indexes of the entity that owns a one-to-one association	 * to the entity at the given index (-1 if there is no "owner")	 */	protected int[] getOwners() {		return owners;	}	protected EntityType[] getOwnerAssociationTypes() {		return ownerAssociationTypes;	}	// -- Loader overrides --	protected boolean isSubselectLoadingEnabled() {		return hasSubselectLoadableCollections();	}	/**	 * @param lockModes a collection of lock modes specified dynamically via the Query interface	 */	protected LockMode[] getLockModes(Map lockModes) {		if ( lockModes==null || lockModes.size()==0 ) {			return defaultLockModes;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -