📄 queryloader.java
字号:
// $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 + -