Package org.hibernate.loader
Class Loader
java.lang.Object
org.hibernate.loader.Loader
- Direct Known Subclasses:
BasicLoader,CustomLoader
Abstract superclass of object loading (and querying) strategies. This class implements
useful common functionality that concrete loaders delegate to. It is not intended that this
functionality would be directly accessed by client code. (Hence, all methods of this class
are declared protected or private.) This class relies heavily upon the
Loadable interface, which is the contract between this class and
EntityPersisters that may be loaded by it.
The present implementation is able to load any number of columns of entities and at most one collection role per query.
The present implementation is able to load any number of columns of entities and at most one collection role per query.
- See Also:
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected StringapplyLocks(String sql, LockOptions lockOptions, Dialect dialect) Append FOR UPDATE OF clause, if necessary.protected voidapplyPostLoadLocks(Object[] row, LockMode[] lockModesArray, SessionImplementor session) protected booleanareResultSetRowsTransformedImmediately(ResultTransformer transformer) Are rows transformed immediately after being read from the ResultSet?protected voidprotected intbindNamedParameters(PreparedStatement statement, Map namedParams, int startIndex, SessionImplementor session) Bind named parameters to the JDBC prepared statement.protected intbindParameterValues(PreparedStatement statement, QueryParameters queryParameters, int startIndex, SessionImplementor session) Bind all parameter values into the prepared statement in preparation for execution.protected intbindPositionalParameters(PreparedStatement statement, QueryParameters queryParameters, int startIndex, SessionImplementor session) Bind positional parameter values to the JDBC prepared statement.protected voidCheck whether the current loader can support returning ScrollableResults.protected ListdoList(SessionImplementor session, QueryParameters queryParameters) Actually execute a query, ignoring the query cacheprotected voidextractKeysFromResultSet(Loadable[] persisters, QueryParameters queryParameters, ResultSet resultSet, SessionImplementor session, EntityKey[] keys, LockMode[] lockModes, List hydratedObjects) protected String[]Get the SQL table aliases of entities whose associations are subselect-loadable, returning null if this loader does not support subselect loadingprotected abstract CollectionAliases[]protected int[]Get the index of the entity that owns the collection, or -1 if there is no owner in the query results (ie.protected CollectionPersister[]An (optional) persister for a collection to be initialized; only collection loaders return a non-null valueprotected int[][]protected abstract EntityAliases[]Get the result set descriptorprotected boolean[]An array indicating whether the entities have eager property fetching enabled.protected abstract Loadable[]An array of persisters of entity classes contained in each row of results; implemented by all subclassesprotected abstract LockMode[]getLockModes(LockOptions lockOptions) What lock options does this load entities with?int[]getNamedParameterLocs(String name) protected EntityType[]An array of the owner types corresponding to thegetOwners()returns.protected int[]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 StringIdentifies the query for statistics reporting, if null, no statistics will be reportedprotected ObjectgetResultColumnOrRow(Object[] row, ResultTransformer transformer, ResultSet rs, SessionImplementor session) Get the actual object that is returned in the user-visible result list.protected ListgetResultList(List results, ResultTransformer resultTransformer) protected final ResultSetgetResultSet(PreparedStatement st, boolean autodiscovertypes, boolean callable, RowSelection selection, SessionImplementor session) Fetch a PreparedStatement, call setMaxRows and then execute it, advance to the first result and return an SQL ResultSetprotected abstract StringThe SQL query string to be called; implemented by all subclassesprotected booleanprotected booleanReturn false is this loader is a batch entity loaderprotected booleanprotected Listlist(SessionImplementor session, QueryParameters queryParameters, Set querySpaces, Type[] resultTypes) Return the query results, using the query cache, called by subclasses that implement cacheable queriesfinal voidloadCollection(SessionImplementor session, Serializable id, Type type) Called by subclasses that initialize collectionsfinal voidloadCollectionBatch(SessionImplementor session, Serializable[] ids, Type type) Called by wrappers that batch initialize collectionsprotected final voidloadCollectionSubselect(SessionImplementor session, Serializable[] ids, Object[] parameterValues, Type[] parameterTypes, Map namedParameters, Type type) Called by subclasses that batch initialize collectionsprotected final ListloadEntity(SessionImplementor session, Object key, Object index, Type keyType, Type indexType, EntityPersister persister) Called by subclasses that load entitiesprotected final ListloadEntity(SessionImplementor session, Object id, Type identifierType, Object optionalObject, String optionalEntityName, Serializable optionalIdentifier, EntityPersister persister, LockOptions lockOptions) Called by subclasses that load entitiesfinal ListloadEntityBatch(SessionImplementor session, Serializable[] ids, Type idType, Object optionalObject, String optionalEntityName, Serializable optionalId, EntityPersister persister, LockOptions lockOptions) Called by wrappers that batch load entitiesloadSequentialRowsForward(ResultSet resultSet, SessionImplementor session, QueryParameters queryParameters, boolean returnProxies) Loads a single logical row from the result set moving forward.loadSequentialRowsReverse(ResultSet resultSet, SessionImplementor session, QueryParameters queryParameters, boolean returnProxies, boolean isLogicallyAfterLast) Loads a single logical row from the result set moving forward.loadSingleRow(ResultSet resultSet, SessionImplementor session, QueryParameters queryParameters, boolean returnProxies) Loads a single row from the result set.protected booleanDoes the result set to be scrolled contain collection fetches?protected voidCalculate and cache select-clause suffixes.protected final PreparedStatementprepareQueryStatement(QueryParameters queryParameters, boolean scroll, SessionImplementor session) Obtain a PreparedStatement with all parameters pre-bound.protected StringpreprocessSQL(String sql, QueryParameters parameters, Dialect dialect) Modify the SQL, adding lock hints and comments, if necessaryprotected ResultTransformerresolveResultTransformer(ResultTransformer resultTransformer) Determine the actual ResultTransformer that will be used to transform query results.protected ScrollableResultsscroll(QueryParameters queryParameters, Type[] returnTypes, HolderInstantiator holderInstantiator, SessionImplementor session) Return the query results, as an instance of ScrollableResultstoString()protected booleanDoes this query return objects that might be already cached by the session, whose lock mode may need upgrading
-
Constructor Details
-
Loader
-
-
Method Details
-
getSQLString
The SQL query string to be called; implemented by all subclasses- Returns:
- The sql command this loader should use to get its
ResultSet.
-
getEntityPersisters
An array of persisters of entity classes contained in each row of results; implemented by all subclasses- Returns:
- The entity persisters.
-
getEntityEagerPropertyFetches
protected boolean[] getEntityEagerPropertyFetches()An array indicating whether the entities have eager property fetching enabled.- Returns:
- Eager property fetching indicators.
-
getOwners
protected int[] getOwners()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"). The indexes contained here are relative to the result ofgetEntityPersisters().- Returns:
- The owner indicators (see discussion above).
-
getOwnerAssociationTypes
An array of the owner types corresponding to thegetOwners()returns. Indices indicating no owner would be null here.- Returns:
- The types for the owners.
-
getCollectionPersisters
An (optional) persister for a collection to be initialized; only collection loaders return a non-null value -
getCollectionOwners
protected int[] getCollectionOwners()Get the index of the entity that owns the collection, or -1 if there is no owner in the query results (ie. in the case of a collection initializer) or no collection. -
getCompositeKeyManyToOneTargetIndices
protected int[][] getCompositeKeyManyToOneTargetIndices() -
getLockModes
What lock options does this load entities with?- Parameters:
lockOptions- a collection of lock options specified dynamically via the Query interface
-
applyLocks
protected String applyLocks(String sql, LockOptions lockOptions, Dialect dialect) throws HibernateException Append FOR UPDATE OF clause, if necessary. This empty superclass implementation merely returns its first argument.- Throws:
HibernateException
-
upgradeLocks
protected boolean upgradeLocks()Does this query return objects that might be already cached by the session, whose lock mode may need upgrading -
isSingleRowLoader
protected boolean isSingleRowLoader()Return false is this loader is a batch entity loader -
getAliases
Get the SQL table aliases of entities whose associations are subselect-loadable, returning null if this loader does not support subselect loading -
preprocessSQL
protected String preprocessSQL(String sql, QueryParameters parameters, Dialect dialect) throws HibernateException Modify the SQL, adding lock hints and comments, if necessary- Throws:
HibernateException
-
loadSingleRow
public Object loadSingleRow(ResultSet resultSet, SessionImplementor session, QueryParameters queryParameters, boolean returnProxies) throws HibernateException Loads a single row from the result set. This is the processing used from the ScrollableResults where no collection fetches were encountered.- Parameters:
resultSet- The result set from which to do the load.session- The session from which the request originated.queryParameters- The query parameters specified by the user.returnProxies- Should proxies be generated- Returns:
- The loaded "row".
- Throws:
HibernateException
-
loadSequentialRowsForward
public Object loadSequentialRowsForward(ResultSet resultSet, SessionImplementor session, QueryParameters queryParameters, boolean returnProxies) throws HibernateException Loads a single logical row from the result set moving forward. This is the processing used from the ScrollableResults where there were collection fetches encountered; thus a single logical row may have multiple rows in the underlying result set.- Parameters:
resultSet- The result set from which to do the load.session- The session from which the request originated.queryParameters- The query parameters specified by the user.returnProxies- Should proxies be generated- Returns:
- The loaded "row".
- Throws:
HibernateException
-
loadSequentialRowsReverse
public Object loadSequentialRowsReverse(ResultSet resultSet, SessionImplementor session, QueryParameters queryParameters, boolean returnProxies, boolean isLogicallyAfterLast) throws HibernateException Loads a single logical row from the result set moving forward. This is the processing used from the ScrollableResults where there were collection fetches encountered; thus a single logical row may have multiple rows in the underlying result set.- Parameters:
resultSet- The result set from which to do the load.session- The session from which the request originated.queryParameters- The query parameters specified by the user.returnProxies- Should proxies be generated- Returns:
- The loaded "row".
- Throws:
HibernateException
-
extractKeysFromResultSet
protected void extractKeysFromResultSet(Loadable[] persisters, QueryParameters queryParameters, ResultSet resultSet, SessionImplementor session, EntityKey[] keys, LockMode[] lockModes, List hydratedObjects) throws SQLException - Throws:
SQLException
-
applyPostLoadLocks
protected void applyPostLoadLocks(Object[] row, LockMode[] lockModesArray, SessionImplementor session) -
isSubselectLoadingEnabled
protected boolean isSubselectLoadingEnabled() -
hasSubselectLoadableCollections
protected boolean hasSubselectLoadableCollections() -
resolveResultTransformer
Determine the actual ResultTransformer that will be used to transform query results.- Parameters:
resultTransformer- the specified result transformer- Returns:
- the actual result transformer
-
getResultList
protected List getResultList(List results, ResultTransformer resultTransformer) throws QueryException - Throws:
QueryException
-
areResultSetRowsTransformedImmediately
Are rows transformed immediately after being read from the ResultSet?- Parameters:
transformer- the specified transformer- Returns:
- true, if getResultColumnOrRow() transforms the results; false, otherwise
-
getResultColumnOrRow
protected Object getResultColumnOrRow(Object[] row, ResultTransformer transformer, ResultSet rs, SessionImplementor session) throws SQLException, HibernateException Get the actual object that is returned in the user-visible result list. This empty implementation merely returns its first argument. This is overridden by some subclasses.- Throws:
SQLExceptionHibernateException
-
prepareQueryStatement
protected final PreparedStatement prepareQueryStatement(QueryParameters queryParameters, boolean scroll, SessionImplementor session) throws SQLException, HibernateException Obtain a PreparedStatement with all parameters pre-bound. Bind JDBC-style ? parameters, named parameters, and limit parameters.- Throws:
SQLExceptionHibernateException
-
bindParameterValues
protected int bindParameterValues(PreparedStatement statement, QueryParameters queryParameters, int startIndex, SessionImplementor session) throws SQLException Bind all parameter values into the prepared statement in preparation for execution.- Parameters:
statement- The JDBC prepared statementqueryParameters- The encapsulation of the parameter values to be bound.startIndex- The position from which to start binding parameter values.session- The originating session.- Returns:
- The number of JDBC bind positions actually bound during this method execution.
- Throws:
SQLException- Indicates problems performing the binding.
-
bindPositionalParameters
protected int bindPositionalParameters(PreparedStatement statement, QueryParameters queryParameters, int startIndex, SessionImplementor session) throws SQLException, HibernateException Bind positional parameter values to the JDBC prepared statement. Positional parameters are those specified by JDBC-style ? parameters in the source query. It is (currently) expected that these come before any named parameters in the source query.- Parameters:
statement- The JDBC prepared statementqueryParameters- The encapsulation of the parameter values to be bound.startIndex- The position from which to start binding parameter values.session- The originating session.- Returns:
- The number of JDBC bind positions actually bound during this method execution.
- Throws:
SQLException- Indicates problems performing the binding.HibernateException- Indicates problems delegating binding to the types.
-
bindNamedParameters
protected int bindNamedParameters(PreparedStatement statement, Map namedParams, int startIndex, SessionImplementor session) throws SQLException, HibernateException Bind named parameters to the JDBC prepared statement. This is a generic implementation, the problem being that in the general case we do not know enough information about the named parameters to perform this in a complete manner here. Thus this is generally overridden on subclasses allowing named parameters to apply the specific behavior. The most usual limitation here is that we need to assume the type span is always one...- Parameters:
statement- The JDBC prepared statementnamedParams- A map of parameter names to valuesstartIndex- The position from which to start binding parameter values.session- The originating session.- Returns:
- The number of JDBC bind positions actually bound during this method execution.
- Throws:
SQLException- Indicates problems performing the binding.HibernateException- Indicates problems delegating binding to the types.
-
getNamedParameterLocs
-
getResultSet
protected final ResultSet getResultSet(PreparedStatement st, boolean autodiscovertypes, boolean callable, RowSelection selection, SessionImplementor session) throws SQLException, HibernateException Fetch a PreparedStatement, call setMaxRows and then execute it, advance to the first result and return an SQL ResultSet- Throws:
SQLExceptionHibernateException
-
autoDiscoverTypes
-
loadEntity
protected final List loadEntity(SessionImplementor session, Object id, Type identifierType, Object optionalObject, String optionalEntityName, Serializable optionalIdentifier, EntityPersister persister, LockOptions lockOptions) throws HibernateException Called by subclasses that load entities- Parameters:
persister- only needed for logginglockOptions-- Throws:
HibernateException
-
loadEntity
protected final List loadEntity(SessionImplementor session, Object key, Object index, Type keyType, Type indexType, EntityPersister persister) throws HibernateException Called by subclasses that load entities- Parameters:
persister- only needed for logging- Throws:
HibernateException
-
loadEntityBatch
public final List loadEntityBatch(SessionImplementor session, Serializable[] ids, Type idType, Object optionalObject, String optionalEntityName, Serializable optionalId, EntityPersister persister, LockOptions lockOptions) throws HibernateException Called by wrappers that batch load entities- Parameters:
persister- only needed for logginglockOptions-- Throws:
HibernateException
-
loadCollection
public final void loadCollection(SessionImplementor session, Serializable id, Type type) throws HibernateException Called by subclasses that initialize collections- Throws:
HibernateException
-
loadCollectionBatch
public final void loadCollectionBatch(SessionImplementor session, Serializable[] ids, Type type) throws HibernateException Called by wrappers that batch initialize collections- Throws:
HibernateException
-
loadCollectionSubselect
protected final void loadCollectionSubselect(SessionImplementor session, Serializable[] ids, Object[] parameterValues, Type[] parameterTypes, Map namedParameters, Type type) throws HibernateException Called by subclasses that batch initialize collections- Throws:
HibernateException
-
list
protected List list(SessionImplementor session, QueryParameters queryParameters, Set querySpaces, Type[] resultTypes) throws HibernateException Return the query results, using the query cache, called by subclasses that implement cacheable queries- Throws:
HibernateException
-
doList
protected List doList(SessionImplementor session, QueryParameters queryParameters) throws HibernateException Actually execute a query, ignoring the query cache- Throws:
HibernateException
-
checkScrollability
Check whether the current loader can support returning ScrollableResults.- Throws:
HibernateException
-
needsFetchingScroll
protected boolean needsFetchingScroll()Does the result set to be scrolled contain collection fetches?- Returns:
- True if it does, and thus needs the special fetching scroll functionality; false otherwise.
-
scroll
protected ScrollableResults scroll(QueryParameters queryParameters, Type[] returnTypes, HolderInstantiator holderInstantiator, SessionImplementor session) throws HibernateException Return the query results, as an instance of ScrollableResults- Parameters:
queryParameters- The parameters with which the query should be executed.returnTypes- The expected return types of the queryholderInstantiator- If the return values are expected to be wrapped in a holder, this is the thing that knows how to wrap them.session- The session from which the scroll request originated.- Returns:
- The ScrollableResults instance.
- Throws:
HibernateException- Indicates an error executing the query, or constructing the ScrollableResults.
-
postInstantiate
protected void postInstantiate()Calculate and cache select-clause suffixes. Must be called by subclasses after instantiation. -
getEntityAliases
Get the result set descriptor -
getCollectionAliases
-
getQueryIdentifier
Identifies the query for statistics reporting, if null, no statistics will be reported -
getFactory
-
toString
-