sqlcustomquery.java
来自「hibernate-3.0.5 中文文档」· Java 代码 · 共 212 行
JAVA
212 行
//$Id: SQLCustomQuery.java,v 1.11 2005/05/19 22:38:09 oneovthafew Exp $package org.hibernate.loader.custom;import java.util.ArrayList;import java.util.Collection;import java.util.HashSet;import java.util.List;import java.util.Map;import java.util.Set;import org.hibernate.HibernateException;import org.hibernate.LockMode;import org.hibernate.engine.SessionFactoryImplementor;import org.hibernate.loader.BasicLoader;import org.hibernate.loader.DefaultEntityAliases;import org.hibernate.loader.EntityAliases;import org.hibernate.loader.ColumnEntityAliases;import org.hibernate.loader.CollectionAliases;import org.hibernate.loader.GeneratedCollectionAliases;import org.hibernate.persister.collection.CollectionPersister;import org.hibernate.persister.collection.QueryableCollection;import org.hibernate.persister.entity.SQLLoadable;import org.hibernate.type.Type;import org.hibernate.util.ArrayHelper;import org.hibernate.util.StringHelper;/** * Implements Hibernate's built-in support for * native SQL queries. * * @author Gavin King, Max Andersen */public class SQLCustomQuery implements CustomQuery { private final String[] entityNames; private final String[] collectionRoles; private final int[] collectionOwners; private final int[] entityOwners; private final LockMode[] lockModes; private final String sql; private final Set querySpaces = new HashSet(); private final Map namedParameters; private final Type[] scalarTypes; private final String[] scalarColumnAliases; private final EntityAliases[] entityDescriptors; private final CollectionAliases[] collectionDescriptors; public String getSQL() { return sql; } public Map getNamedParameterBindPoints() { return namedParameters; } public String[] getCollectionRoles() { return collectionRoles; } public String[] getEntityNames() { return entityNames; } public LockMode[] getLockModes() { return lockModes; } public EntityAliases[] getEntityAliases() { return entityDescriptors; } public CollectionAliases[] getCollectionAliases() { return collectionDescriptors; } public Set getQuerySpaces() { return querySpaces; } public int[] getCollectionOwner() { return collectionOwners; } public int[] getEntityOwners() { return entityOwners; } public String[] getScalarColumnAliases() { return scalarColumnAliases; } public Type[] getScalarTypes() { return scalarTypes; } public SQLCustomQuery( final SQLQueryReturn[] queryReturns, final SQLQueryScalarReturn[] scalarQueryReturns, final String sqlQuery, final Collection additionalQuerySpaces, final SessionFactoryImplementor factory) throws HibernateException { SQLQueryReturnProcessor processor = new SQLQueryReturnProcessor(queryReturns, scalarQueryReturns, factory); processor.process(); List collectionSuffixes = new ArrayList(); List collectionOwnerAliases = processor.getCollectionOwnerAliases(); List collectionPersisters = processor.getCollectionPersisters(); int size = collectionPersisters.size(); if (size!=0) { collectionOwners = new int[size]; collectionRoles = new String[size]; collectionDescriptors = new CollectionAliases[size]; for ( int i=0; i<size; i++ ) { CollectionPersister collectionPersister = (CollectionPersister) collectionPersisters.get(i); collectionRoles[i] = ( collectionPersister ).getRole(); collectionOwners[i] = processor.getAliases().indexOf( collectionOwnerAliases.get(i) ); String suffix = i + "__"; collectionSuffixes.add(suffix); collectionDescriptors[i] = new GeneratedCollectionAliases( collectionPersister, suffix ); } } else { collectionRoles = null; collectionDescriptors = null; collectionOwners = null; } String[] aliases = ArrayHelper.toStringArray( processor.getAliases() ); String[] collAliases = ArrayHelper.toStringArray( processor.getCollectionAliases() ); String[] collSuffixes = ArrayHelper.toStringArray(collectionSuffixes); Map[] propertyResultMaps = (Map[]) processor.getPropertyResults().toArray( new Map[0] ); Boolean[] useGeneratedAliases = (Boolean[]) processor.getAliasModes().toArray( new Boolean[0] ); SQLLoadable[] entityPersisters = (SQLLoadable[]) processor.getPersisters().toArray( new SQLLoadable[0] ); QueryableCollection[] collPersisters = (QueryableCollection[]) collectionPersisters.toArray( new QueryableCollection[0] ); lockModes = (LockMode[]) processor.getLockModes().toArray( new LockMode[0] ); scalarColumnAliases = ArrayHelper.toStringArray( processor.getScalarColumnAliases() ); scalarTypes = ArrayHelper.toTypeArray( processor.getScalarTypes() ); String[] suffixes = BasicLoader.generateSuffixes(entityPersisters.length); SQLQueryParser parser = new SQLQueryParser( sqlQuery, processor.getAlias2Persister(), processor.getAlias2Return(), aliases, collAliases, collPersisters, suffixes, collSuffixes ); //Very, very ugly! /*if ( ! processor.isCollectionInitializer() && StringHelper.isNotEmpty( processor.getCollectionOwnerAlias() ) ) { collectionOwners = new int[] { parser.getPersisterIndex( processor.getCollectionOwnerAlias() ) }; }*/ sql = parser.process(); namedParameters = parser.getNamedParameters(); // Populate entityNames, entityDescrptors and querySpaces entityNames = new String[entityPersisters.length]; entityDescriptors = new EntityAliases[entityPersisters.length]; for (int i = 0; i < entityPersisters.length; i++) { SQLLoadable persister = entityPersisters[i]; //alias2Persister.put( aliases[i], persister ); //TODO: Does not consider any other tables referenced in the query ArrayHelper.addAll( querySpaces, persister.getQuerySpaces() ); entityNames[i] = persister.getEntityName(); if ( Boolean.TRUE.equals( useGeneratedAliases[i] ) ) { entityDescriptors[i] = new DefaultEntityAliases( propertyResultMaps[i], entityPersisters[i], suffixes[i] ); } else { entityDescriptors[i] = new ColumnEntityAliases( propertyResultMaps[i], entityPersisters[i], suffixes[i] ); } } if (additionalQuerySpaces!=null) { querySpaces.addAll(additionalQuerySpaces); } // Resolve owners Map alias2OwnerAlias = processor.getAlias2OwnerAlias(); int[] ownersArray = new int[entityPersisters.length]; for ( int j=0; j < aliases.length; j++ ) { String ownerAlias = (String) alias2OwnerAlias.get( aliases[j] ); if ( StringHelper.isNotEmpty(ownerAlias) ) { ownersArray[j] = processor.getAliases().indexOf( ownerAlias ); } else { ownersArray[j] = -1; } } if ( ArrayHelper.isAllNegative(ownersArray) ) { ownersArray = null; } this.entityOwners = ownersArray; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?