From: <hib...@li...> - 2006-06-15 05:28:37
|
Author: ste...@jb... Date: 2006-06-15 01:21:06 -0400 (Thu, 15 Jun 2006) New Revision: 10018 Added: trunk/Hibernate3/src/org/hibernate/engine/query/sql/ trunk/Hibernate3/src/org/hibernate/engine/query/sql/NativeSQLQueryCollectionReturn.java trunk/Hibernate3/src/org/hibernate/engine/query/sql/NativeSQLQueryJoinReturn.java trunk/Hibernate3/src/org/hibernate/engine/query/sql/NativeSQLQueryNonScalarReturn.java trunk/Hibernate3/src/org/hibernate/engine/query/sql/NativeSQLQueryReturn.java trunk/Hibernate3/src/org/hibernate/engine/query/sql/NativeSQLQueryRootReturn.java trunk/Hibernate3/src/org/hibernate/engine/query/sql/NativeSQLQueryScalarReturn.java trunk/Hibernate3/src/org/hibernate/engine/query/sql/NativeSQLQuerySpecification.java trunk/Hibernate3/src/org/hibernate/loader/custom/CollectionFetchReturn.java trunk/Hibernate3/src/org/hibernate/loader/custom/CollectionReturn.java trunk/Hibernate3/src/org/hibernate/loader/custom/EntityFetchReturn.java trunk/Hibernate3/src/org/hibernate/loader/custom/FetchReturn.java trunk/Hibernate3/src/org/hibernate/loader/custom/NonScalarReturn.java trunk/Hibernate3/src/org/hibernate/loader/custom/Return.java trunk/Hibernate3/src/org/hibernate/loader/custom/RootReturn.java trunk/Hibernate3/src/org/hibernate/loader/custom/ScalarReturn.java trunk/Hibernate3/src/org/hibernate/loader/custom/sql/ trunk/Hibernate3/src/org/hibernate/loader/custom/sql/SQLCustomQuery.java trunk/Hibernate3/src/org/hibernate/loader/custom/sql/SQLQueryParser.java trunk/Hibernate3/src/org/hibernate/loader/custom/sql/SQLQueryReturnProcessor.java Removed: trunk/Hibernate3/src/org/hibernate/engine/query/NativeSQLQuerySpecification.java trunk/Hibernate3/src/org/hibernate/loader/custom/SQLCustomQuery.java trunk/Hibernate3/src/org/hibernate/loader/custom/SQLQueryCollectionReturn.java trunk/Hibernate3/src/org/hibernate/loader/custom/SQLQueryJoinReturn.java trunk/Hibernate3/src/org/hibernate/loader/custom/SQLQueryParser.java trunk/Hibernate3/src/org/hibernate/loader/custom/SQLQueryReturn.java trunk/Hibernate3/src/org/hibernate/loader/custom/SQLQueryReturnProcessor.java trunk/Hibernate3/src/org/hibernate/loader/custom/SQLQueryRootReturn.java trunk/Hibernate3/src/org/hibernate/loader/custom/SQLQueryScalarReturn.java Modified: trunk/Hibernate3/src/org/hibernate/cfg/NamedSQLQuerySecondPass.java trunk/Hibernate3/src/org/hibernate/cfg/ResultSetMappingBinder.java trunk/Hibernate3/src/org/hibernate/engine/NamedSQLQueryDefinition.java trunk/Hibernate3/src/org/hibernate/engine/ResultSetMappingDefinition.java trunk/Hibernate3/src/org/hibernate/engine/SessionImplementor.java trunk/Hibernate3/src/org/hibernate/engine/query/NativeSQLQueryPlan.java trunk/Hibernate3/src/org/hibernate/engine/query/QueryPlanCache.java trunk/Hibernate3/src/org/hibernate/impl/AbstractSessionImpl.java trunk/Hibernate3/src/org/hibernate/impl/SQLQueryImpl.java trunk/Hibernate3/src/org/hibernate/impl/SessionFactoryImpl.java trunk/Hibernate3/src/org/hibernate/impl/SessionImpl.java trunk/Hibernate3/src/org/hibernate/impl/StatelessSessionImpl.java trunk/Hibernate3/src/org/hibernate/loader/Loader.java trunk/Hibernate3/src/org/hibernate/loader/custom/CustomLoader.java trunk/Hibernate3/src/org/hibernate/loader/custom/CustomQuery.java trunk/Hibernate3/test/org/hibernate/test/sql/General.hbm.xml trunk/Hibernate3/test/org/hibernate/test/sql/GeneralTest.java trunk/Hibernate3/test/org/hibernate/test/sql/OracleSQLTest.java Log: native sql result ordering Modified: trunk/Hibernate3/src/org/hibernate/cfg/NamedSQLQuerySecondPass.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/cfg/NamedSQLQuerySecondPass.java 2006-06-14 00:31:15 UTC (rev 10017) +++ trunk/Hibernate3/src/org/hibernate/cfg/NamedSQLQuerySecondPass.java 2006-06-15 05:21:06 UTC (rev 10018) @@ -69,17 +69,16 @@ HbmBinder.getCacheMode( cacheMode ), readOnly, comment, - HbmBinder.getParameterTypes(queryElem), + HbmBinder.getParameterTypes( queryElem ), callable - ); + ); //TODO check there is no actual definition elemnents when a ref is defined } else { - ResultSetMappingDefinition definition = buildResultSetMappingDefinition(queryElem, path, mappings); + ResultSetMappingDefinition definition = buildResultSetMappingDefinition( queryElem, path, mappings ); namedQuery = new NamedSQLQueryDefinition( queryElem.getText(), - definition.getEntityQueryReturns(), - definition.getScalarQueryReturns(), + definition.getQueryReturns(), synchronizedTables, cacheable, region, @@ -89,9 +88,9 @@ HbmBinder.getCacheMode( cacheMode ), readOnly, comment, - HbmBinder.getParameterTypes(queryElem), + HbmBinder.getParameterTypes( queryElem ), callable - ); + ); } log.debug( "Named SQL query: " + queryName + " -> " + namedQuery.getQueryString() ); Modified: trunk/Hibernate3/src/org/hibernate/cfg/ResultSetMappingBinder.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/cfg/ResultSetMappingBinder.java 2006-06-14 00:31:15 UTC (rev 10017) +++ trunk/Hibernate3/src/org/hibernate/cfg/ResultSetMappingBinder.java 2006-06-15 05:21:06 UTC (rev 10018) @@ -12,11 +12,11 @@ import org.dom4j.Element; import org.hibernate.LockMode; import org.hibernate.MappingException; +import org.hibernate.engine.query.sql.NativeSQLQueryCollectionReturn; import org.hibernate.engine.ResultSetMappingDefinition; -import org.hibernate.loader.custom.SQLQueryCollectionReturn; -import org.hibernate.loader.custom.SQLQueryJoinReturn; -import org.hibernate.loader.custom.SQLQueryRootReturn; -import org.hibernate.loader.custom.SQLQueryScalarReturn; +import org.hibernate.engine.query.sql.NativeSQLQueryJoinReturn; +import org.hibernate.engine.query.sql.NativeSQLQueryRootReturn; +import org.hibernate.engine.query.sql.NativeSQLQueryScalarReturn; import org.hibernate.mapping.Component; import org.hibernate.mapping.PersistentClass; import org.hibernate.mapping.Value; @@ -32,44 +32,53 @@ * @author Emmanuel Bernard */ public abstract class ResultSetMappingBinder { + /** + * Build a ResultSetMappingDefinition given a containing element for the "return-XXX" elements + * + * @param resultSetElem The element containing the return definitions. + * @param path No clue... + * @param mappings The current processing state. + * @return The description of the mappings... + */ protected static ResultSetMappingDefinition buildResultSetMappingDefinition(Element resultSetElem, String path, Mappings mappings) { String resultSetName = resultSetElem.attribute( "name" ).getValue(); - if (path != null) resultSetName = path + '.' + resultSetName; + if ( path != null ) { + resultSetName = path + '.' + resultSetName; + } ResultSetMappingDefinition definition = new ResultSetMappingDefinition( resultSetName ); - Iterator returns = resultSetElem.elementIterator( "return-scalar" ); - while ( returns.hasNext() ) { - Element returnElem = (Element) returns.next(); - String column = returnElem.attributeValue( "column" ); - String typeFromXML = HbmBinder.getTypeFromXML( returnElem ); - Type type = null; - if(typeFromXML!=null) { - type = TypeFactory.heuristicType( typeFromXML ); - if ( type == null ) { - throw new MappingException( "could not determine type " + type ); - } - } - definition.addScalarQueryReturn( new SQLQueryScalarReturn( column, type ) ); - } - returns = resultSetElem.elementIterator(); + int cnt = 0; + Iterator returns = resultSetElem.elementIterator(); while ( returns.hasNext() ) { cnt++; Element returnElem = (Element) returns.next(); String name = returnElem.getName(); - if ( "return".equals( name ) ) { - definition.addEntityQueryReturn( bindReturn( returnElem, mappings, cnt ) ); + if ( "return-scalar".equals( name ) ) { + String column = returnElem.attributeValue( "column" ); + String typeFromXML = HbmBinder.getTypeFromXML( returnElem ); + Type type = null; + if(typeFromXML!=null) { + type = TypeFactory.heuristicType( typeFromXML ); + if ( type == null ) { + throw new MappingException( "could not determine type " + type ); + } + } + definition.addQueryReturn( new NativeSQLQueryScalarReturn( column, type ) ); } + else if ( "return".equals( name ) ) { + definition.addQueryReturn( bindReturn( returnElem, mappings, cnt ) ); + } else if ( "return-join".equals( name ) ) { - definition.addEntityQueryReturn( bindReturnJoin( returnElem, mappings ) ); + definition.addQueryReturn( bindReturnJoin( returnElem, mappings ) ); } else if ( "load-collection".equals( name ) ) { - definition.addEntityQueryReturn( bindLoadCollection( returnElem, mappings ) ); + definition.addQueryReturn( bindLoadCollection( returnElem, mappings ) ); } } return definition; } - private static SQLQueryRootReturn bindReturn(Element returnElem, Mappings mappings, int elementCount) { + private static NativeSQLQueryRootReturn bindReturn(Element returnElem, Mappings mappings, int elementCount) { String alias = returnElem.attributeValue( "alias" ); if( StringHelper.isEmpty(alias)) { alias = "alias_" + elementCount; // hack/workaround as sqlquery impl depend on having a key. @@ -84,7 +93,7 @@ PersistentClass pc = mappings.getClass( entityName ); java.util.Map propertyResults = bindPropertyResults(alias, returnElem, pc, mappings ); - return new SQLQueryRootReturn( + return new NativeSQLQueryRootReturn( alias, entityName, propertyResults, @@ -92,7 +101,7 @@ ); } - private static SQLQueryJoinReturn bindReturnJoin(Element returnElem, Mappings mappings) { + private static NativeSQLQueryJoinReturn bindReturnJoin(Element returnElem, Mappings mappings) { String alias = returnElem.attributeValue( "alias" ); String roleAttribute = returnElem.attributeValue( "property" ); LockMode lockMode = getLockMode( returnElem.attributeValue( "lock-mode" ) ); @@ -109,7 +118,7 @@ //FIXME: get the PersistentClass java.util.Map propertyResults = bindPropertyResults(alias, returnElem, null, mappings ); - return new SQLQueryJoinReturn( + return new NativeSQLQueryJoinReturn( alias, roleOwnerAlias, roleProperty, @@ -118,7 +127,7 @@ ); } - private static SQLQueryCollectionReturn bindLoadCollection(Element returnElem, Mappings mappings) { + private static NativeSQLQueryCollectionReturn bindLoadCollection(Element returnElem, Mappings mappings) { String alias = returnElem.attributeValue( "alias" ); String collectionAttribute = returnElem.attributeValue( "role" ); LockMode lockMode = getLockMode( returnElem.attributeValue( "lock-mode" ) ); @@ -135,7 +144,7 @@ //FIXME: get the PersistentClass java.util.Map propertyResults = bindPropertyResults(alias, returnElem, null, mappings ); - return new SQLQueryCollectionReturn( + return new NativeSQLQueryCollectionReturn( alias, ownerClassName, ownerPropertyName, @@ -331,7 +340,7 @@ return name; } - private static final LockMode getLockMode(String lockMode) { + private static LockMode getLockMode(String lockMode) { if ( lockMode == null || "read".equals( lockMode ) ) { return LockMode.READ; } Modified: trunk/Hibernate3/src/org/hibernate/engine/NamedSQLQueryDefinition.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/engine/NamedSQLQueryDefinition.java 2006-06-14 00:31:15 UTC (rev 10017) +++ trunk/Hibernate3/src/org/hibernate/engine/NamedSQLQueryDefinition.java 2006-06-15 05:21:06 UTC (rev 10018) @@ -6,9 +6,7 @@ import org.hibernate.FlushMode; import org.hibernate.CacheMode; -import org.hibernate.engine.query.NativeSQLQuerySpecification; -import org.hibernate.loader.custom.SQLQueryReturn; -import org.hibernate.loader.custom.SQLQueryScalarReturn; +import org.hibernate.engine.query.sql.NativeSQLQueryReturn; /** * Definition of a named native SQL query, defined @@ -18,8 +16,7 @@ */ public class NamedSQLQueryDefinition extends NamedQueryDefinition { - private SQLQueryReturn[] queryReturns; - private SQLQueryScalarReturn[] scalarReturns; + private NativeSQLQueryReturn[] queryReturns; private final List querySpaces; private final boolean callable; private String resultSetRef; @@ -31,7 +28,6 @@ * * @param query The sql query string * @param queryReturns The in-lined query return definitions - * @param scalarReturns The in-lined scalar query return definitions * @param querySpaces Any specified query spaces (used for auto-flushing) * @param cacheable Whether the query results are cacheable * @param cacheRegion If cacheable, the region into which to store the results @@ -46,8 +42,7 @@ */ public NamedSQLQueryDefinition( String query, - SQLQueryReturn[] queryReturns, - SQLQueryScalarReturn[] scalarReturns, + NativeSQLQueryReturn[] queryReturns, List querySpaces, boolean cacheable, String cacheRegion, @@ -72,7 +67,6 @@ parameterTypes ); this.queryReturns = queryReturns; - this.scalarReturns = scalarReturns; this.querySpaces = querySpaces; this.callable = callable; } @@ -169,14 +163,10 @@ ); } - public SQLQueryReturn[] getQueryReturns() { + public NativeSQLQueryReturn[] getQueryReturns() { return queryReturns; } - public SQLQueryScalarReturn[] getScalarQueryReturns() { - return scalarReturns; - } - public List getQuerySpaces() { return querySpaces; } Modified: trunk/Hibernate3/src/org/hibernate/engine/ResultSetMappingDefinition.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/engine/ResultSetMappingDefinition.java 2006-06-14 00:31:15 UTC (rev 10017) +++ trunk/Hibernate3/src/org/hibernate/engine/ResultSetMappingDefinition.java 2006-06-15 05:21:06 UTC (rev 10018) @@ -5,8 +5,7 @@ import java.util.List; import java.io.Serializable; -import org.hibernate.loader.custom.SQLQueryReturn; -import org.hibernate.loader.custom.SQLQueryScalarReturn; +import org.hibernate.engine.query.sql.NativeSQLQueryReturn; /** * Keep a description of the resultset mapping @@ -14,33 +13,34 @@ * @author Emmanuel Bernard */ public class ResultSetMappingDefinition implements Serializable { - /** List<SQLQueryReturn> */ - private List entityQueryReturns = new ArrayList(); - /** List<SQLQueryScalarReturn> */ - private List scalarQueryReturns = new ArrayList(); - private String name; - public String getName() { - return name; - } + private final String name; + private final List /*NativeSQLQueryReturn*/ queryReturns = new ArrayList(); public ResultSetMappingDefinition(String name) { this.name = name; } - public void addEntityQueryReturn(SQLQueryReturn entityQueryReturn) { - entityQueryReturns.add(entityQueryReturn); + public String getName() { + return name; } - public void addScalarQueryReturn(SQLQueryScalarReturn scalarQueryReturn) { - scalarQueryReturns.add(scalarQueryReturn); + public void addQueryReturn(NativeSQLQueryReturn queryReturn) { + queryReturns.add( queryReturn ); } - public SQLQueryReturn[] getEntityQueryReturns() { - return (SQLQueryReturn[]) entityQueryReturns.toArray( new SQLQueryReturn[0] ); +// We could also keep these if needed for binary compatibility with annotations, provided +// it only uses the addXXX() methods... +// public void addEntityQueryReturn(NativeSQLQueryNonScalarReturn entityQueryReturn) { +// entityQueryReturns.add(entityQueryReturn); +// } +// +// public void addScalarQueryReturn(NativeSQLQueryScalarReturn scalarQueryReturn) { +// scalarQueryReturns.add(scalarQueryReturn); +// } + + public NativeSQLQueryReturn[] getQueryReturns() { + return ( NativeSQLQueryReturn[] ) queryReturns.toArray( new NativeSQLQueryReturn[0] ); } - public SQLQueryScalarReturn[] getScalarQueryReturns() { - return (SQLQueryScalarReturn[]) scalarQueryReturns.toArray( new SQLQueryScalarReturn[0] ); - } } Modified: trunk/Hibernate3/src/org/hibernate/engine/SessionImplementor.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/engine/SessionImplementor.java 2006-06-14 00:31:15 UTC (rev 10017) +++ trunk/Hibernate3/src/org/hibernate/engine/SessionImplementor.java 2006-06-15 05:21:06 UTC (rev 10018) @@ -16,7 +16,7 @@ import org.hibernate.ScrollMode; import org.hibernate.ScrollableResults; import org.hibernate.Transaction; -import org.hibernate.engine.query.NativeSQLQuerySpecification; +import org.hibernate.engine.query.sql.NativeSQLQuerySpecification; import org.hibernate.collection.PersistentCollection; import org.hibernate.event.EventListeners; import org.hibernate.impl.CriteriaImpl; Modified: trunk/Hibernate3/src/org/hibernate/engine/query/NativeSQLQueryPlan.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/engine/query/NativeSQLQueryPlan.java 2006-06-14 00:31:15 UTC (rev 10017) +++ trunk/Hibernate3/src/org/hibernate/engine/query/NativeSQLQueryPlan.java 2006-06-15 05:21:06 UTC (rev 10018) @@ -1,7 +1,6 @@ package org.hibernate.engine.query; import java.io.Serializable; -import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Iterator; @@ -12,6 +11,7 @@ import org.apache.commons.logging.LogFactory; import org.hibernate.HibernateException; import org.hibernate.QueryException; +import org.hibernate.engine.query.sql.NativeSQLQuerySpecification; import org.hibernate.action.BulkOperationCleanupAction; import org.hibernate.engine.QueryParameters; import org.hibernate.engine.SessionFactoryImplementor; @@ -19,15 +19,14 @@ import org.hibernate.engine.TypedValue; import org.hibernate.event.EventSource; import org.hibernate.exception.JDBCExceptionHelper; -import org.hibernate.loader.custom.SQLCustomQuery; -import org.hibernate.pretty.Formatter; +import org.hibernate.loader.custom.sql.SQLCustomQuery; import org.hibernate.type.Type; import org.hibernate.util.ArrayHelper; /** * Defines a query execution plan for a native-SQL query. * - * @author <a href="mailto:st...@hi...">Steve Ebersole </a> + * @author Steve Ebersole */ public class NativeSQLQueryPlan implements Serializable { private final String sourceQuery; @@ -36,13 +35,15 @@ private static final Log log = LogFactory.getLog(NativeSQLQueryPlan.class); - public NativeSQLQueryPlan(NativeSQLQuerySpecification specification, + public NativeSQLQueryPlan( + NativeSQLQuerySpecification specification, SessionFactoryImplementor factory) { this.sourceQuery = specification.getQueryString(); - customQuery = new SQLCustomQuery( specification.getSqlQueryReturns(), - specification.getSqlQueryScalarReturns(), specification - .getQueryString(), specification.getQuerySpaces(), + customQuery = new SQLCustomQuery( + specification.getQueryString(), + specification.getQueryReturns(), + specification.getQuerySpaces(), factory ); } @@ -147,7 +148,7 @@ } int result = 0; - PreparedStatement ps = null; + PreparedStatement ps; try { queryParameters.processFilters( this.customQuery.getSQL(), session ); Deleted: trunk/Hibernate3/src/org/hibernate/engine/query/NativeSQLQuerySpecification.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/engine/query/NativeSQLQuerySpecification.java 2006-06-14 00:31:15 UTC (rev 10017) +++ trunk/Hibernate3/src/org/hibernate/engine/query/NativeSQLQuerySpecification.java 2006-06-15 05:21:06 UTC (rev 10018) @@ -1,93 +0,0 @@ -package org.hibernate.engine.query; - -import org.hibernate.loader.custom.SQLQueryReturn; -import org.hibernate.loader.custom.SQLQueryScalarReturn; -import org.hibernate.util.ArrayHelper; - -import java.util.Set; -import java.util.Collection; -import java.util.HashSet; -import java.util.Arrays; -import java.util.Collections; - -/** - * Defines the specification or blue-print for a native-sql query. - * Essentially a simple struct containing the information needed to "translate" - * a native-sql query and cache that translated representation. Also used as - * the key by which the native-sql query plans are cached. - * - * @author Steve Ebersole - */ -public class NativeSQLQuerySpecification { - private final String queryString; - private final SQLQueryReturn[] sqlQueryReturns; - private final SQLQueryScalarReturn[] sqlQueryScalarReturns; - private final Set querySpaces; - private final int hashCode; - - public NativeSQLQuerySpecification( - String queryString, - SQLQueryReturn[] sqlQueryReturns, - SQLQueryScalarReturn[] sqlQueryScalarReturns, - Collection querySpaces) { - this.queryString = queryString; - this.sqlQueryReturns = sqlQueryReturns; - this.sqlQueryScalarReturns = sqlQueryScalarReturns; - if ( querySpaces == null ) { - this.querySpaces = Collections.EMPTY_SET; - } - else { - Set tmp = new HashSet(); - tmp.addAll( querySpaces ); - this.querySpaces = Collections.unmodifiableSet( tmp ); - } - - // pre-determine and cache the hashcode - int hashCode = queryString.hashCode(); - hashCode = 29 * hashCode + this.querySpaces.hashCode(); - if ( this.sqlQueryReturns != null ) { - hashCode = 29 * hashCode + ArrayHelper.toList( this.sqlQueryReturns ).hashCode(); - } - if ( this.sqlQueryScalarReturns != null ) { - hashCode = 29 * hashCode + ArrayHelper.toList( this.sqlQueryScalarReturns ).hashCode(); - } - this.hashCode = hashCode; - } - - public String getQueryString() { - return queryString; - } - - public SQLQueryReturn[] getSqlQueryReturns() { - return sqlQueryReturns; - } - - public SQLQueryScalarReturn[] getSqlQueryScalarReturns() { - return sqlQueryScalarReturns; - } - - public Set getQuerySpaces() { - return querySpaces; - } - - public boolean equals(Object o) { - if ( this == o ) { - return true; - } - if ( o == null || getClass() != o.getClass() ) { - return false; - } - - final NativeSQLQuerySpecification that = ( NativeSQLQuerySpecification ) o; - - return querySpaces.equals( that.querySpaces ) && - queryString.equals( that.queryString ) && - Arrays.equals( sqlQueryReturns, that.sqlQueryReturns ) && - Arrays.equals( sqlQueryScalarReturns, that.sqlQueryScalarReturns ); - } - - - public int hashCode() { - return hashCode; - } -} Modified: trunk/Hibernate3/src/org/hibernate/engine/query/QueryPlanCache.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/engine/query/QueryPlanCache.java 2006-06-14 00:31:15 UTC (rev 10017) +++ trunk/Hibernate3/src/org/hibernate/engine/query/QueryPlanCache.java 2006-06-15 05:21:06 UTC (rev 10018) @@ -4,6 +4,7 @@ import org.hibernate.util.SimpleMRUCache; import org.hibernate.util.SoftLimitMRUCache; import org.hibernate.engine.SessionFactoryImplementor; +import org.hibernate.engine.query.sql.NativeSQLQuerySpecification; import org.hibernate.QueryException; import org.hibernate.MappingException; import org.apache.commons.logging.Log; Added: trunk/Hibernate3/src/org/hibernate/engine/query/sql/NativeSQLQueryCollectionReturn.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/engine/query/sql/NativeSQLQueryCollectionReturn.java 2006-06-14 00:31:15 UTC (rev 10017) +++ trunk/Hibernate3/src/org/hibernate/engine/query/sql/NativeSQLQueryCollectionReturn.java 2006-06-15 05:21:06 UTC (rev 10018) @@ -0,0 +1,60 @@ +// $Id: NativeSQLQueryCollectionReturn.java 7232 2005-06-19 17:16:40 -0500 (Sun, 19 Jun 2005) maxcsaucdk $ +package org.hibernate.engine.query.sql; + +import java.util.Map; + +import org.hibernate.LockMode; + +/** + * Represents a return defined as part of a native sql query which + * names a collection role in the form {classname}.{collectionrole}; it + * is used in defining a custom sql query for loading an entity's + * collection in non-fetching scenarios (i.e., loading the collection + * itself as the "root" of the result). + * + * @author Steve Ebersole + */ +public class NativeSQLQueryCollectionReturn extends NativeSQLQueryNonScalarReturn { + private String ownerEntityName; + private String ownerProperty; + + /** + * Construct a native-sql return representing a collection initializer + * + * @param alias The result alias + * @param ownerEntityName The entity-name of the entity owning the collection + * to be initialized. + * @param ownerProperty The property name (on the owner) which represents + * the collection to be initialized. + * @param propertyResults Any user-supplied column->property mappings + * @param lockMode The lock mode to apply to the collection. + */ + public NativeSQLQueryCollectionReturn( + String alias, + String ownerEntityName, + String ownerProperty, + Map propertyResults, + LockMode lockMode) { + super( alias, propertyResults, lockMode ); + this.ownerEntityName = ownerEntityName; + this.ownerProperty = ownerProperty; + } + + /** + * Returns the class owning the collection. + * + * @return The class owning the collection. + */ + public String getOwnerEntityName() { + return ownerEntityName; + } + + /** + * Returns the name of the property representing the collection from the {@link #getOwnerEntityName}. + * + * @return The name of the property representing the collection on the owner class. + */ + public String getOwnerProperty() { + return ownerProperty; + } +} Added: trunk/Hibernate3/src/org/hibernate/engine/query/sql/NativeSQLQueryJoinReturn.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/engine/query/sql/NativeSQLQueryJoinReturn.java 2006-06-14 00:31:15 UTC (rev 10017) +++ trunk/Hibernate3/src/org/hibernate/engine/query/sql/NativeSQLQueryJoinReturn.java 2006-06-15 05:21:06 UTC (rev 10018) @@ -0,0 +1,56 @@ +// $Id: NativeSQLQueryJoinReturn.java 7232 2005-06-19 17:16:40 -0500 (Sun, 19 Jun 2005) maxcsaucdk $ +package org.hibernate.engine.query.sql; + +import java.util.Map; + +import org.hibernate.LockMode; + +/** + * Represents a return defined as part of a native sql query which + * names a fetched role. + * + * @author Steve Ebersole + */ +public class NativeSQLQueryJoinReturn extends NativeSQLQueryNonScalarReturn { + private String ownerAlias; + private String ownerProperty; + + /** + * Construct a return descriptor representing some form of fetch. + * + * @param alias The result alias + * @param ownerAlias The owner's result alias + * @param ownerProperty The owner's property representing the thing to be fetched + * @param propertyResults Any user-supplied column->property mappings + * @param lockMode The lock mode to apply + */ + public NativeSQLQueryJoinReturn( + String alias, + String ownerAlias, + String ownerProperty, + Map propertyResults, + LockMode lockMode) { + super( alias, propertyResults, lockMode ); + this.ownerAlias = ownerAlias; + this.ownerProperty = ownerProperty; + } + + /** + * Retrieve the alias of the owner of this fetched association. + * + * @return The owner's alias. + */ + public String getOwnerAlias() { + return ownerAlias; + } + + /** + * Retrieve the property name (relative to the owner) which maps to + * the association to be fetched. + * + * @return The property name. + */ + public String getOwnerProperty() { + return ownerProperty; + } +} Added: trunk/Hibernate3/src/org/hibernate/engine/query/sql/NativeSQLQueryNonScalarReturn.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/engine/query/sql/NativeSQLQueryNonScalarReturn.java 2006-06-14 00:31:15 UTC (rev 10017) +++ trunk/Hibernate3/src/org/hibernate/engine/query/sql/NativeSQLQueryNonScalarReturn.java 2006-06-15 05:21:06 UTC (rev 10018) @@ -0,0 +1,67 @@ +// $Id: NativeSQLQueryNonScalarReturn.java 7232 2005-06-19 17:16:40 -0500 (Sun, 19 Jun 2005) maxcsaucdk $ +package org.hibernate.engine.query.sql; + +import java.io.Serializable; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import org.hibernate.HibernateException; +import org.hibernate.LockMode; + +/** + * Represents the base information for a non-scalar return defined as part of + * a native sql query. + * + * @author Steve Ebersole + */ +public abstract class NativeSQLQueryNonScalarReturn implements NativeSQLQueryReturn, Serializable { + private final String alias; + private final LockMode lockMode; + private final Map propertyResults = new HashMap(); + + /** + * Constructs some form of non-scalar return descriptor + * + * @param alias The result alias + * @param propertyResults Any user-supplied column->property mappings + * @param lockMode The lock mode to apply to the return. + */ + protected NativeSQLQueryNonScalarReturn(String alias, Map propertyResults, LockMode lockMode) { + this.alias = alias; + if ( alias == null ) { + throw new HibernateException("alias must be specified"); + } + this.lockMode = lockMode; + if ( propertyResults != null ) { + this.propertyResults.putAll( propertyResults ); + } + } + + /** + * Retrieve the defined result alias + * + * @return The result alias. + */ + public String getAlias() { + return alias; + } + + /** + * Retrieve the lock-mode to apply to this return + * + * @return The lock mode + */ + public LockMode getLockMode() { + return lockMode; + } + + /** + * Retrieve the user-supplied column->property mappings. + * + * @return The property mappings. + */ + public Map getPropertyResultsMap() { + return Collections.unmodifiableMap( propertyResults ); + } +} Added: trunk/Hibernate3/src/org/hibernate/engine/query/sql/NativeSQLQueryReturn.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/engine/query/sql/NativeSQLQueryReturn.java 2006-06-14 00:31:15 UTC (rev 10017) +++ trunk/Hibernate3/src/org/hibernate/engine/query/sql/NativeSQLQueryReturn.java 2006-06-15 05:21:06 UTC (rev 10018) @@ -0,0 +1,9 @@ +package org.hibernate.engine.query.sql; + +/** + * Describes a return in a native SQL query. + * + * @author Steve Ebersole + */ +public interface NativeSQLQueryReturn { +} Added: trunk/Hibernate3/src/org/hibernate/engine/query/sql/NativeSQLQueryRootReturn.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/engine/query/sql/NativeSQLQueryRootReturn.java 2006-06-14 00:31:15 UTC (rev 10017) +++ trunk/Hibernate3/src/org/hibernate/engine/query/sql/NativeSQLQueryRootReturn.java 2006-06-15 05:21:06 UTC (rev 10018) @@ -0,0 +1,52 @@ +// $Id: NativeSQLQueryRootReturn.java 7232 2005-06-19 17:16:40 -0500 (Sun, 19 Jun 2005) maxcsaucdk $ +package org.hibernate.engine.query.sql; + +import java.util.Map; + +import org.hibernate.LockMode; + +/** + * Represents a return defined as part of a native sql query which + * names a "root" entity. A root entity means it is explicitly a + * "column" in the result, as opposed to a fetched relationship or role. + * + * @author Steve Ebersole + */ +public class NativeSQLQueryRootReturn extends NativeSQLQueryNonScalarReturn { + private String returnEntityName; + + /** + * Construct a return representing an entity returned at the root + * of the result. + * + * @param alias The result alias + * @param entityName The entity name. + * @param lockMode The lock mode to apply + */ + public NativeSQLQueryRootReturn(String alias, String entityName, LockMode lockMode) { + this(alias, entityName, null, lockMode); + } + + /** + * + * @param alias The result alias + * @param entityName The entity name. + * @param propertyResults Any user-supplied column->property mappings + * @param lockMode The lock mode to apply + */ + public NativeSQLQueryRootReturn(String alias, String entityName, Map propertyResults, LockMode lockMode) { + super( alias, propertyResults, lockMode ); + this.returnEntityName = entityName; + + } + + /** + * The name of the entity to be returned. + * + * @return The entity name + */ + public String getReturnEntityName() { + return returnEntityName; + } + +} Added: trunk/Hibernate3/src/org/hibernate/engine/query/sql/NativeSQLQueryScalarReturn.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/engine/query/sql/NativeSQLQueryScalarReturn.java 2006-06-14 00:31:15 UTC (rev 10017) +++ trunk/Hibernate3/src/org/hibernate/engine/query/sql/NativeSQLQueryScalarReturn.java 2006-06-15 05:21:06 UTC (rev 10018) @@ -0,0 +1,27 @@ +package org.hibernate.engine.query.sql; + +import org.hibernate.type.Type; + +/** + * Describes a scalar return in a native SQL query. + * + * @author gloegl + */ +public class NativeSQLQueryScalarReturn implements NativeSQLQueryReturn { + private Type type; + private String columnAlias; + + public NativeSQLQueryScalarReturn(String alias, Type type) { + this.type = type; + this.columnAlias = alias; + } + + public String getColumnAlias() { + return columnAlias; + } + + public Type getType() { + return type; + } + +} Added: trunk/Hibernate3/src/org/hibernate/engine/query/sql/NativeSQLQuerySpecification.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/engine/query/sql/NativeSQLQuerySpecification.java 2006-06-14 00:31:15 UTC (rev 10017) +++ trunk/Hibernate3/src/org/hibernate/engine/query/sql/NativeSQLQuerySpecification.java 2006-06-15 05:21:06 UTC (rev 10018) @@ -0,0 +1,80 @@ +package org.hibernate.engine.query.sql; + +import org.hibernate.util.ArrayHelper; + +import java.util.Set; +import java.util.Collection; +import java.util.HashSet; +import java.util.Arrays; +import java.util.Collections; + +/** + * Defines the specification or blue-print for a native-sql query. + * Essentially a simple struct containing the information needed to "translate" + * a native-sql query and cache that translated representation. Also used as + * the key by which the native-sql query plans are cached. + * + * @author Steve Ebersole + */ +public class NativeSQLQuerySpecification { + private final String queryString; + private final NativeSQLQueryReturn[] queryReturns; + private final Set querySpaces; + private final int hashCode; + + public NativeSQLQuerySpecification( + String queryString, + NativeSQLQueryReturn[] queryReturns, + Collection querySpaces) { + this.queryString = queryString; + this.queryReturns = queryReturns; + if ( querySpaces == null ) { + this.querySpaces = Collections.EMPTY_SET; + } + else { + Set tmp = new HashSet(); + tmp.addAll( querySpaces ); + this.querySpaces = Collections.unmodifiableSet( tmp ); + } + + // pre-determine and cache the hashcode + int hashCode = queryString.hashCode(); + hashCode = 29 * hashCode + this.querySpaces.hashCode(); + if ( this.queryReturns != null ) { + hashCode = 29 * hashCode + ArrayHelper.toList( this.queryReturns ).hashCode(); + } + this.hashCode = hashCode; + } + + public String getQueryString() { + return queryString; + } + + public NativeSQLQueryReturn[] getQueryReturns() { + return queryReturns; + } + + public Set getQuerySpaces() { + return querySpaces; + } + + public boolean equals(Object o) { + if ( this == o ) { + return true; + } + if ( o == null || getClass() != o.getClass() ) { + return false; + } + + final NativeSQLQuerySpecification that = ( NativeSQLQuerySpecification ) o; + + return querySpaces.equals( that.querySpaces ) && + queryString.equals( that.queryString ) && + Arrays.equals( queryReturns, that.queryReturns ); + } + + + public int hashCode() { + return hashCode; + } +} Modified: trunk/Hibernate3/src/org/hibernate/impl/AbstractSessionImpl.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/impl/AbstractSessionImpl.java 2006-06-14 00:31:15 UTC (rev 10017) +++ trunk/Hibernate3/src/org/hibernate/impl/AbstractSessionImpl.java 2006-06-15 05:21:06 UTC (rev 10018) @@ -7,6 +7,7 @@ import org.hibernate.HibernateException; import org.hibernate.ScrollableResults; import org.hibernate.SessionException; +import org.hibernate.engine.query.sql.NativeSQLQuerySpecification; import org.hibernate.engine.NamedQueryDefinition; import org.hibernate.engine.NamedSQLQueryDefinition; import org.hibernate.engine.SessionImplementor; @@ -14,7 +15,6 @@ import org.hibernate.engine.SessionFactoryImplementor; import org.hibernate.engine.query.HQLQueryPlan; import org.hibernate.engine.query.NativeSQLQueryPlan; -import org.hibernate.engine.query.NativeSQLQuerySpecification; import java.util.List; Modified: trunk/Hibernate3/src/org/hibernate/impl/SQLQueryImpl.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/impl/SQLQueryImpl.java 2006-06-14 00:31:15 UTC (rev 10017) +++ trunk/Hibernate3/src/org/hibernate/impl/SQLQueryImpl.java 2006-06-15 05:21:06 UTC (rev 10018) @@ -17,16 +17,16 @@ import org.hibernate.ScrollMode; import org.hibernate.ScrollableResults; import org.hibernate.MappingException; +import org.hibernate.engine.query.sql.NativeSQLQuerySpecification; import org.hibernate.engine.ResultSetMappingDefinition; import org.hibernate.engine.NamedSQLQueryDefinition; import org.hibernate.engine.QueryParameters; import org.hibernate.engine.SessionImplementor; import org.hibernate.engine.query.ParameterMetadata; -import org.hibernate.engine.query.NativeSQLQuerySpecification; -import org.hibernate.loader.custom.SQLQueryJoinReturn; -import org.hibernate.loader.custom.SQLQueryReturn; -import org.hibernate.loader.custom.SQLQueryRootReturn; -import org.hibernate.loader.custom.SQLQueryScalarReturn; +import org.hibernate.engine.query.sql.NativeSQLQueryJoinReturn; +import org.hibernate.engine.query.sql.NativeSQLQueryScalarReturn; +import org.hibernate.engine.query.sql.NativeSQLQueryRootReturn; +import org.hibernate.engine.query.sql.NativeSQLQueryReturn; import org.hibernate.type.Type; import org.hibernate.util.CollectionHelper; import org.hibernate.util.StringHelper; @@ -47,7 +47,6 @@ public class SQLQueryImpl extends AbstractQueryImpl implements SQLQuery { private final List queryReturns; - private final List scalarQueryReturns; private final Collection querySpaces; private final boolean callable; private boolean autodiscovertypes; @@ -69,11 +68,9 @@ queryDef.getResultSetRef() ); } - this.scalarQueryReturns = Arrays.asList( definition.getScalarQueryReturns() ); - this.queryReturns = Arrays.asList( definition.getEntityQueryReturns() ); + this.queryReturns = Arrays.asList( definition.getQueryReturns() ); } else { - this.scalarQueryReturns = Arrays.asList( queryDef.getScalarQueryReturns() ); this.queryReturns = Arrays.asList( queryDef.getQueryReturns() ); } @@ -84,7 +81,6 @@ SQLQueryImpl( final String sql, final List queryReturns, - final List scalarQueryReturns, final Collection querySpaces, final FlushMode flushMode, boolean callable, @@ -93,7 +89,6 @@ // TODO : absolutely no usages of this constructor form; can it go away? super( sql, flushMode, session, parameterMetadata ); this.queryReturns = queryReturns; - this.scalarQueryReturns = scalarQueryReturns; this.querySpaces = querySpaces; this.callable = callable; } @@ -109,14 +104,13 @@ ParameterMetadata parameterMetadata) { // TODO : this constructor form is *only* used from constructor directly below us; can it go away? super( sql, flushMode, session, parameterMetadata ); - scalarQueryReturns=null; queryReturns = new ArrayList(returnAliases.length); for ( int i=0; i<returnAliases.length; i++ ) { - SQLQueryRootReturn ret = new SQLQueryRootReturn( + NativeSQLQueryRootReturn ret = new NativeSQLQueryRootReturn( returnAliases[i], returnClasses[i].getName(), lockModes==null ? LockMode.NONE : lockModes[i] - ); + ); queryReturns.add(ret); } this.querySpaces = querySpaces; @@ -135,24 +129,16 @@ SQLQueryImpl(String sql, SessionImplementor session, ParameterMetadata parameterMetadata) { super( sql, null, session, parameterMetadata ); queryReturns = new ArrayList(); - scalarQueryReturns = new ArrayList(); querySpaces = null; callable = false; } - private static final SQLQueryReturn[] NO_SQL_RETURNS = new SQLQueryReturn[0]; - private static final SQLQueryScalarReturn[] NO_SQL_SCALAR_RETURNS = new SQLQueryScalarReturn[0]; + private static final NativeSQLQueryReturn[] NO_SQL_RETURNS = new NativeSQLQueryReturn[0]; - private SQLQueryReturn[] getQueryReturns() { - return (SQLQueryReturn[]) queryReturns.toArray(NO_SQL_RETURNS); + private NativeSQLQueryReturn[] getQueryReturns() { + return ( NativeSQLQueryReturn[] ) queryReturns.toArray( NO_SQL_RETURNS ); } - private SQLQueryScalarReturn[] getQueryScalarReturns() { - return scalarQueryReturns==null ? - null : - (SQLQueryScalarReturn[]) scalarQueryReturns.toArray(NO_SQL_SCALAR_RETURNS); - } - public List list() throws HibernateException { verifyParameters(); before(); @@ -172,7 +158,6 @@ return new NativeSQLQuerySpecification( expandParameterLists(namedParams), getQueryReturns(), - getQueryScalarReturns(), querySpaces ); } @@ -211,22 +196,21 @@ } protected void verifyParameters() { - verifyParameters(callable); - boolean noReturns = ( queryReturns==null || queryReturns.isEmpty() ) && - ( scalarQueryReturns==null || scalarQueryReturns.isEmpty() ); - if (noReturns) { + verifyParameters( callable ); + boolean noReturns = queryReturns==null || queryReturns.isEmpty(); + if ( noReturns ) { this.autodiscovertypes = noReturns; - /*throw new QueryException( - "addEntity() or addScalar() must be called on a sql query before executing the query.", - getQueryString() - );*/ } else { - if ( scalarQueryReturns != null ) { - Iterator iter = scalarQueryReturns.iterator(); - while ( iter.hasNext() ) { - SQLQueryScalarReturn scalar = (SQLQueryScalarReturn) iter.next(); - if ( scalar.getType() == null ) autodiscovertypes = true; + Iterator itr = queryReturns.iterator(); + while ( itr.hasNext() ) { + NativeSQLQueryReturn rtn = ( NativeSQLQueryReturn ) itr.next(); + if ( rtn instanceof NativeSQLQueryScalarReturn ) { + NativeSQLQueryScalarReturn scalar = ( NativeSQLQueryScalarReturn ) rtn; + if ( scalar.getType() == null ) { + autodiscovertypes = true; + break; + } } } } @@ -250,13 +234,13 @@ } public SQLQuery addScalar(String columnAlias, Type type) { - scalarQueryReturns.add( new SQLQueryScalarReturn(columnAlias, type) ); + queryReturns.add( new NativeSQLQueryScalarReturn( columnAlias, type ) ); return this; } public SQLQuery addScalar(String columnAlias) { autodiscovertypes = true; - scalarQueryReturns.add( new SQLQueryScalarReturn(columnAlias, null) ); + queryReturns.add( new NativeSQLQueryScalarReturn( columnAlias, null ) ); return this; } @@ -287,12 +271,12 @@ } String ownerAlias = path.substring(0, loc); String role = path.substring(loc+1); - queryReturns.add( new SQLQueryJoinReturn(alias, ownerAlias, role, CollectionHelper.EMPTY_MAP, lockMode) ); + queryReturns.add( new NativeSQLQueryJoinReturn(alias, ownerAlias, role, CollectionHelper.EMPTY_MAP, lockMode) ); return this; } public SQLQuery addEntity(String alias, String entityName, LockMode lockMode) { - queryReturns.add( new SQLQueryRootReturn(alias, entityName, lockMode) ); + queryReturns.add( new NativeSQLQueryRootReturn(alias, entityName, lockMode) ); return this; } @@ -301,20 +285,15 @@ } public SQLQuery setResultSetMapping(String name) { - ResultSetMappingDefinition mapping = session.getFactory().getResultSetMapping(name); - if (mapping == null) { - throw new MappingException("Unknown SqlResultSetMapping named:" + name); + ResultSetMappingDefinition mapping = session.getFactory().getResultSetMapping( name ); + if ( mapping == null ) { + throw new MappingException( "Unknown SqlResultSetMapping [" + name + "]" ); } - SQLQueryReturn[] returns = mapping.getEntityQueryReturns(); + NativeSQLQueryReturn[] returns = mapping.getQueryReturns(); int length = returns.length; - for (int index = 0 ; index < length ; index++ ) { + for ( int index = 0 ; index < length ; index++ ) { queryReturns.add( returns[index] ); } - SQLQueryScalarReturn[] scalarReturns = mapping.getScalarQueryReturns(); - length = scalarReturns.length; - for (int index = 0 ; index < length ; index++ ) { - scalarQueryReturns.add( scalarReturns[index] ); - } return this; } Modified: trunk/Hibernate3/src/org/hibernate/impl/SessionFactoryImpl.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/impl/SessionFactoryImpl.java 2006-06-14 00:31:15 UTC (rev 10017) +++ trunk/Hibernate3/src/org/hibernate/impl/SessionFactoryImpl.java 2006-06-15 05:21:06 UTC (rev 10018) @@ -34,6 +34,7 @@ import org.hibernate.QueryException; import org.hibernate.SessionFactory; import org.hibernate.StatelessSession; +import org.hibernate.engine.query.sql.NativeSQLQuerySpecification; import org.hibernate.cache.Cache; import org.hibernate.cache.CacheConcurrencyStrategy; import org.hibernate.cache.CacheFactory; @@ -57,7 +58,6 @@ import org.hibernate.engine.NamedSQLQueryDefinition; import org.hibernate.engine.ResultSetMappingDefinition; import org.hibernate.engine.SessionFactoryImplementor; -import org.hibernate.engine.query.NativeSQLQuerySpecification; import org.hibernate.engine.query.QueryPlanCache; import org.hibernate.event.EventListeners; import org.hibernate.exception.SQLExceptionConverter; @@ -429,8 +429,7 @@ } spec = new NativeSQLQuerySpecification( qd.getQueryString(), - definition.getEntityQueryReturns(), - definition.getScalarQueryReturns(), + definition.getQueryReturns(), qd.getQuerySpaces() ); } @@ -439,7 +438,6 @@ spec = new NativeSQLQuerySpecification( qd.getQueryString(), qd.getQueryReturns(), - qd.getScalarQueryReturns(), qd.getQuerySpaces() ); } Modified: trunk/Hibernate3/src/org/hibernate/impl/SessionImpl.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/impl/SessionImpl.java 2006-06-14 00:31:15 UTC (rev 10017) +++ trunk/Hibernate3/src/org/hibernate/impl/SessionImpl.java 2006-06-15 05:21:06 UTC (rev 10018) @@ -41,6 +41,7 @@ import org.hibernate.Transaction; import org.hibernate.TransientObjectException; import org.hibernate.UnresolvableObjectException; +import org.hibernate.engine.query.sql.NativeSQLQuerySpecification; import org.hibernate.collection.PersistentCollection; import org.hibernate.engine.ActionQueue; import org.hibernate.engine.CollectionEntry; @@ -54,7 +55,6 @@ import org.hibernate.engine.query.FilterQueryPlan; import org.hibernate.engine.query.HQLQueryPlan; import org.hibernate.engine.query.NativeSQLQueryPlan; -import org.hibernate.engine.query.NativeSQLQuerySpecification; import org.hibernate.event.AutoFlushEvent; import org.hibernate.event.AutoFlushEventListener; import org.hibernate.event.DeleteEvent; @@ -89,8 +89,6 @@ import org.hibernate.loader.criteria.CriteriaLoader; import org.hibernate.loader.custom.CustomLoader; import org.hibernate.loader.custom.CustomQuery; -import org.hibernate.loader.custom.SQLQueryReturn; -import org.hibernate.loader.custom.SQLQueryScalarReturn; import org.hibernate.persister.collection.CollectionPersister; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.persister.entity.OuterJoinLoadable; Modified: trunk/Hibernate3/src/org/hibernate/impl/StatelessSessionImpl.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/impl/StatelessSessionImpl.java 2006-06-14 00:31:15 UTC (rev 10017) +++ trunk/Hibernate3/src/org/hibernate/impl/StatelessSessionImpl.java 2006-06-15 05:21:06 UTC (rev 10018) @@ -36,7 +36,7 @@ import org.hibernate.engine.Versioning; import org.hibernate.engine.query.HQLQueryPlan; import org.hibernate.engine.query.NativeSQLQueryPlan; -import org.hibernate.engine.query.NativeSQLQuerySpecification; +import org.hibernate.engine.query.sql.NativeSQLQuerySpecification; import org.hibernate.event.EventListeners; import org.hibernate.id.IdentifierGeneratorFactory; import org.hibernate.jdbc.Batcher; Modified: trunk/Hibernate3/src/org/hibernate/loader/Loader.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/loader/Loader.java 2006-06-14 00:31:15 UTC (rev 10017) +++ trunk/Hibernate3/src/org/hibernate/loader/Loader.java 2006-06-15 05:21:06 UTC (rev 10018) @@ -544,8 +544,7 @@ final EntityKey optionalObjectKey, final List hydratedObjects, final EntityKey[] keys, - boolean returnProxies) - throws SQLException, HibernateException { + boolean returnProxies) throws SQLException, HibernateException { final Loadable[] persisters = getEntityPersisters(); final int entitySpan = persisters.length; @@ -575,7 +574,7 @@ lockModeArray, hydratedObjects, session - ); + ); readCollectionElements( row, resultSet, session ); @@ -646,9 +645,10 @@ } } - private List doQuery(final SessionImplementor session, - final QueryParameters queryParameters, - final boolean returnProxies) throws SQLException, HibernateException { + private List doQuery( + final SessionImplementor session, + final QueryParameters queryParameters, + final boolean returnProxies) throws SQLException, HibernateException { final RowSelection selection = queryParameters.getRowSelection(); final int maxRows = hasMaxRows( selection ) ? @@ -695,7 +695,7 @@ hydratedObjects, keys, returnProxies - ); + ); results.add( result ); if ( createSubselects ) { @@ -1215,7 +1215,6 @@ } return rowResults; - } /** @@ -1674,8 +1673,8 @@ advance( rs, selection ); } - if(autodiscovertypes) { - autoDiscoverTypes(rs); + if ( autodiscovertypes ) { + autoDiscoverTypes( rs ); } return rs; } Added: trunk/Hibernate3/src/org/hibernate/loader/custom/CollectionFetchReturn.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/loader/custom/CollectionFetchReturn.java 2006-06-14 00:31:15 UTC (rev 10017) +++ trunk/Hibernate3/src/org/hibernate/loader/custom/CollectionFetchReturn.java 2006-06-15 05:21:06 UTC (rev 10018) @@ -0,0 +1,35 @@ +package org.hibernate.loader.custom; + +import org.hibernate.loader.CollectionAliases; +import org.hibernate.loader.EntityAliases; +import org.hibernate.LockMode; + +/** + * Spefically a fetch return that refers to a collection association. + * + * @author Steve Ebersole + */ +public class CollectionFetchReturn extends FetchReturn { + private final CollectionAliases collectionAliases; + private final EntityAliases elementEntityAliases; + + public CollectionFetchReturn( + String alias, + NonScalarReturn owner, + String ownerProperty, + CollectionAliases collectionAliases, + EntityAliases elementEntityAliases, + LockMode lockMode) { + super( owner, ownerProperty, alias, lockMode ); + this.collectionAliases = collectionAliases; + this.elementEntityAliases = elementEntityAliases; + } + + public CollectionAliases getCollectionAliases() { + return collectionAliases; + } + + public EntityAliases getElementEntityAliases() { + return elementEntityAliases; + } +} Added: trunk/Hibernate3/src/org/hibernate/loader/custom/CollectionReturn.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/loader/custom/CollectionReturn.java 2006-06-14 00:31:15 UTC (rev 10017) +++ trunk/Hibernate3/src/org/hibernate/loader/custom/CollectionReturn.java 2006-06-15 05:21:06 UTC (rev 10018) @@ -0,0 +1,60 @@ +package org.hibernate.loader.custom; + +import org.hibernate.LockMode; +import org.hibernate.loader.CollectionAliases; +import org.hibernate.loader.EntityAliases; + +/** + * Represents a return which names a collection role; it + * is used in defining a custom query for loading an entity's + * collection in non-fetching scenarios (i.e., loading the collection + * itself as the "root" of the result). + * + * @author Steve Ebersole + */ +public class CollectionReturn extends NonScalarReturn { + private final String ownerEntityName; + private final String ownerProperty; + private final CollectionAliases collectionAliases; + private final EntityAliases elementEntityAliases; + + public CollectionReturn( + String alias, + String ownerEntityName, + String ownerProperty, + CollectionAliases collectionAliases, + EntityAliases elementEntityAliases, + LockMode lockMode) { + super( alias, lockMode ); + this.ownerEntityName = ownerEntityName; + this.ownerProperty = ownerProperty; + this.collectionAliases = collectionAliases; + this.elementEntityAliases = elementEntityAliases; + } + + /** + * Returns the class owning the collection. + * + * @return The class owning the collection. + */ + public String getOwnerEntityName() { + return ownerEntityName; + } + + /** + * Returns the name of the property representing the collection from the {@link #getOwnerEntityName}. + * + * @return The name of the property representing the collection on the owner class. + */ + public String getOwnerProperty() { + return ownerProperty; + } + + public CollectionAliases getCollectionAliases() { + return collectionAliases; + } + + public EntityAliases getElementEntityAliases() { + return elementEntityAliases; + } +} Modified: trunk/Hibernate3/src/org/hibernate/loader/custom/CustomLoader.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/loader/custom/CustomLoader.java 2006-06-14 00:31:15 UTC (rev 10017) +++ trunk/Hibernate3/src/org/hibernate/loader/custom/CustomLoader.java 2006-06-15 05:21:06 UTC (rev 10018) @@ -7,6 +7,9 @@ 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; @@ -20,199 +23,308 @@ 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. + * 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 Type[] resultTypes; - private final Loadable[] persisters; - private final CollectionPersister[] collectionPersisters; - private final CustomQuery customQuery; - private Type[] discoveredTypes; - private String[] discoveredColumnAliases; - private ResultSetMetaData metaData; - private final String[] queryReturnAliases; - - public CustomLoader( - CustomQuery customQuery, - SessionFactoryImplementor factory) { - super(factory); - this.customQuery = customQuery; - - queryReturnAliases = customQuery.getReturnAliases(); - - String[] collectionRoles = customQuery.getCollectionRoles(); - if ( collectionRoles==null ) { - collectionPersisters = null; - } - else { - int length = collectionRoles.length; - collectionPersisters = new CollectionPersister[length]; - for ( int i=0; i<length; i++ ) { - collectionPersisters[i] = factory.getCollectionPersister( collectionRoles[i] ); + + 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; + resultColumnProcessors.add( + new ScalarResultColumnProcessor( + scalarRtn.getColumnAlias(), + scalarRtn.getType(), + resultTypes.size() + ) + ); + resultTypes.add( scalarRtn.getType() ); + specifiedAliases.add( scalarRtn.getColumnAlias() ); + 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 element... [truncated message content] |