Class ReadObjectQuery

  • All Implemented Interfaces:
    java.io.Serializable, java.lang.Cloneable

    public class ReadObjectQuery
    extends ObjectLevelReadQuery

    Purpose: Concrete class for all read queries involving a single object.

    Responsibilities: Return a single object for the query. Implements the inheritance feature when dealing with abstract descriptors.

    See Also:
    Serialized Form
    Author:
    Yvon Lavoie
    Since:
    TOPLink/Java 1.0
    • Field Detail

      • selectionObject

        protected transient java.lang.Object selectionObject
        Object that can be used in place of a selection criteria.
      • selectionId

        protected java.lang.Object selectionId
        Key that can be used in place of a selection criteria.
      • shouldLoadResultIntoSelectionObject

        protected boolean shouldLoadResultIntoSelectionObject
        Can be used to refresh a specific non-cached instance from the database.
    • Constructor Detail

      • ReadObjectQuery

        public ReadObjectQuery()
        PUBLIC: Return a new read object query. A reference class must be specified before execution. It is better to provide the class and expression builder on construction to esnure a single expression builder is used. If no selection criteria is specified this will reads the first object found in the database.
      • ReadObjectQuery

        public ReadObjectQuery​(java.lang.Class classToRead,
                               Expression selectionCriteria)
        PUBLIC: Return a new read object query for the class and the selection criteria.
      • ReadObjectQuery

        public ReadObjectQuery​(java.lang.Class classToRead,
                               ExpressionBuilder builder)
        PUBLIC: Return a new read object query for the class. The expression builder must be used for all associated expressions used with the query.
      • ReadObjectQuery

        public ReadObjectQuery​(java.lang.Class classToRead,
                               Call call)
        PUBLIC: Return a new read object query. The call represents a database interaction such as SQL, Stored Procedure.
      • ReadObjectQuery

        public ReadObjectQuery​(Call call)
        PUBLIC: Return a new read object query. The call represents a database interaction such as SQL, Stored Procedure.
      • ReadObjectQuery

        public ReadObjectQuery​(java.lang.Object objectToRead)
        PUBLIC: Return a query to read the object with the same primary key as the provided object. Note: This is not a query by example object, only the primary key will be used for the selection criteria.
      • ReadObjectQuery

        public ReadObjectQuery​(java.lang.Object exampleObject,
                               QueryByExamplePolicy policy)
        PUBLIC: Return a query by example query to find an object matching the attributes of the example object.
      • ReadObjectQuery

        public ReadObjectQuery​(ExpressionBuilder builder)
        PUBLIC: The expression builder should be provide on creation to ensure only one is used.
    • Method Detail

      • cacheResult

        public void cacheResult​(java.lang.Object object)
        INTERNAL:

        This method is called by the object builder when building an original. It will cause the original to be cached in the query results if the query is set to do so.

        Specified by:
        cacheResult in class ReadQuery
      • checkCacheByExactPrimaryKey

        public void checkCacheByExactPrimaryKey()
        PUBLIC: The cache will be checked only if the query contains exactly the primary key. Queries can be configured to use the cache at several levels. Other caching option are available.
        See Also:
        ObjectLevelReadQuery.setCacheUsage(int)
      • checkCacheByPrimaryKey

        public void checkCacheByPrimaryKey()
        PUBLIC: This is the default, the cache will be checked only if the query contains the primary key. Queries can be configured to use the cache at several levels. Other caching option are available.
        See Also:
        ObjectLevelReadQuery.setCacheUsage(int)
      • checkCacheThenDatabase

        public void checkCacheThenDatabase()
        PUBLIC: The cache will be checked completely, then if the object is not found or the query too complex the database will be queried. Queries can be configured to use the cache at several levels. Other caching option are available.
        See Also:
        ObjectLevelReadQuery.setCacheUsage(int)
      • checkEarlyReturnLocal

        protected java.lang.Object checkEarlyReturnLocal​(org.eclipse.persistence.internal.sessions.AbstractSession session,
                                                         org.eclipse.persistence.internal.sessions.AbstractRecord translationRow)
        INTERNAL: The cache check is done before the prepare as a hit will not require the work to be done.
        Specified by:
        checkEarlyReturnLocal in class ObjectLevelReadQuery
      • checkCustomQueryFlag

        protected java.lang.Boolean checkCustomQueryFlag​(org.eclipse.persistence.internal.sessions.AbstractSession session,
                                                         org.eclipse.persistence.internal.sessions.AbstractRecord translationRow)
        INTERNAL: Check and return custom query flag. Custom query flag value is initialized when stored value is null. Called from ObjectLevelReadQuery.checkForCustomQuery(AbstractSession, AbstractRecord) to retrieve custom query flag.
        Specified by:
        checkCustomQueryFlag in class ObjectLevelReadQuery
        Parameters:
        session - Current session.
        translationRow - Database record.
        Returns:
        Current custom query flag. Value will never be null.
      • conformResult

        protected java.lang.Object conformResult​(java.lang.Object result,
                                                 org.eclipse.persistence.internal.sessions.UnitOfWorkImpl unitOfWork,
                                                 org.eclipse.persistence.internal.sessions.AbstractRecord databaseRow,
                                                 boolean buildDirectlyFromRows)
        INTERNAL: Conform the result in the UnitOfWork.
      • dontLoadResultIntoSelectionObject

        public void dontLoadResultIntoSelectionObject()
        PUBLIC: Do not refesh/load into the selection object, this is the default. This property allows for the selection object of the query to be refreshed or put into the TopLink cache. By default on a read or refresh the object in the cache is refreshed and returned or a new object is built from the database, in some cases such as EJB BMP it is desirable to refresh or load into the object passed into the read object query.

        Note: This forces the selection object into the cache a replaces any existing object that may already be there, this is a strict violation of object identity and other objects can still be refering to the old object.

      • execute

        public java.lang.Object execute​(org.eclipse.persistence.internal.sessions.AbstractSession session,
                                        org.eclipse.persistence.internal.sessions.AbstractRecord row)
                                 throws DatabaseException
        INTERNAL: Execute the query. If there are cached results return those. This must override the super to support result caching.
        Overrides:
        execute in class ObjectLevelReadQuery
        Parameters:
        session - the session in which the receiver will be executed.
        Returns:
        An object or vector, the result of executing the query.
        Throws:
        DatabaseException - - an error has occurred on the database
      • extractRemoteResult

        public java.lang.Object extractRemoteResult​(org.eclipse.persistence.internal.sessions.remote.Transporter transporter)
        INTERNAL: Extract the correct query result from the transporter.
        Overrides:
        extractRemoteResult in class DatabaseQuery
      • getDefaultRedirector

        protected QueryRedirector getDefaultRedirector()
        INTERNAL: Returns the specific default redirector for this query type. There are numerous default query redirectors. See ClassDescriptor for their types.
        Overrides:
        getDefaultRedirector in class DatabaseQuery
      • getSelectionKey

        @Deprecated
        public java.util.Vector getSelectionKey()
        Deprecated.
        since EclipseLink 2.1, replaced by getSelectionId()
        PUBLIC: The primary key can be specified if used instead of an expression or selection object. If composite the primary must be in the same order as defined in the descriptor.
        See Also:
        getSelectionId()
      • getSelectionObject

        public java.lang.Object getSelectionObject()
        PUBLIC: Return the selection object of the query. This can be used instead of a where clause expression for single object primary key queries. The selection object given should have a primary key defined, this primary key will be used to query the database instance of the same object. This is a basic form of query by example where only the primary key is required, it can be used for simple query forms, or testing.
      • isReadObjectQuery

        public boolean isReadObjectQuery()
        PUBLIC: Return if this is a read object query.
        Overrides:
        isReadObjectQuery in class DatabaseQuery
      • loadResultIntoSelectionObject

        public void loadResultIntoSelectionObject()
        PUBLIC: Allow for the selection object of the query to be refreshed or put into the EclipseLink cache. By default on a read or refresh the object in the cache is refreshed and returned or a new object is built from the database, in some cases such as EJB BMP it is desirable to refresh or load into the object passed into the read object query.

        Note: This forces the selection object into the cache a replaces any existing object that may already be there, this is a strict violation of object identity and other objects can still be referring to the old object.

      • copyFromQuery

        public void copyFromQuery​(DatabaseQuery query)
        INTERNAL: Copy all setting from the query. This is used to morph queries from one type to the other. By default this calls prepareFromQuery, but additional properties may be required to be copied as prepareFromQuery only copies properties that affect the SQL.
        Overrides:
        copyFromQuery in class ObjectLevelReadQuery
      • prepareCustomQuery

        protected void prepareCustomQuery​(DatabaseQuery customQuery)
        INTERNAL: Set the properties needed to be cascaded into the custom query including the translation row. This is used only for primary key queries, as the descriptor query manager stores a predefined query for this query to avoid having to re-prepare and allow for customization.
        Overrides:
        prepareCustomQuery in class ObjectBuildingQuery
      • registerResultInUnitOfWork

        public java.lang.Object registerResultInUnitOfWork​(java.lang.Object result,
                                                           org.eclipse.persistence.internal.sessions.UnitOfWorkImpl unitOfWork,
                                                           org.eclipse.persistence.internal.sessions.AbstractRecord arguments,
                                                           boolean buildDirectlyFromRows)
        INTERNAL: All objects queried via a UnitOfWork get registered here. If the query went to the database.

        Involves registering the query result individually and in totality, and hence refreshing / conforming is done here.

        Specified by:
        registerResultInUnitOfWork in class ObjectLevelReadQuery
        Parameters:
        result - may be collection (read all) or an object (read one), or even a cursor. If in transaction the shared cache will be bypassed, meaning the result may not be originals from the parent but raw database rows.
        unitOfWork - the unitOfWork the result is being registered in.
        arguments - the original arguments/parameters passed to the query execution. Used by conforming
        buildDirectlyFromRows - If in transaction must construct a registered result from raw database rows.
        Returns:
        the final (conformed, refreshed, wrapped) UnitOfWork query result
      • replaceValueHoldersIn

        public java.util.Map replaceValueHoldersIn​(java.lang.Object object,
                                                   org.eclipse.persistence.internal.sessions.remote.RemoteSessionController controller)
        INTERNAL: replace the value holders in the specified result object(s)
        Overrides:
        replaceValueHoldersIn in class DatabaseQuery
      • getQueryPrimaryKey

        protected java.lang.Object getQueryPrimaryKey()
        INTERNAL: Return the primary key stored in this query
        Overrides:
        getQueryPrimaryKey in class ObjectBuildingQuery
        Returns:
        the selection id of this ReadObjectQuery
        See Also:
        ReadObjectQuery
      • getSelectionId

        public java.lang.Object getSelectionId()
        PUBLIC: Return Id of the object to be selected by the query.
      • clearSelectionId

        public void clearSelectionId()
        INTERNAL: Clear the selection id and object. This is done after cloning queries to prepare them in inheritance.
      • setSelectionId

        public void setSelectionId​(java.lang.Object id)
        PUBLIC: The Id of the object to be selected by the query. This will generate a query by primary key. This can be used instead of an Expression, SQL, or JPQL, or example object. The Id is the Id value for a singleton primary key, for a composite it is an instance of CacheId.
        See Also:
        CacheId
      • setSelectionKey

        @Deprecated
        public void setSelectionKey​(java.util.List selectionKey)
        Deprecated.
        since EclipseLink 2.1, replaced by setSelectionId(Object)
        PUBLIC: The primary key can be specified if used instead of an expression or selection object. If composite the primary must be in the same order as defined in the descriptor.
        See Also:
        setSelectionId(Object)
      • setSelectionObject

        public void setSelectionObject​(java.lang.Object selectionObject)
        PUBLIC: Used to set the where clause of the query. This can be used instead of a where clause expression for single object primary key queries. The selection object given should have a primary key defined, this primary key will be used to query the database instance of the same object. This is a basic form of query by example where only the primary key is required, it can be used for simple query forms, or testing.
      • setShouldLoadResultIntoSelectionObject

        public void setShouldLoadResultIntoSelectionObject​(boolean shouldLoadResultIntoSelectionObject)
        PUBLIC: Allow for the selection object of the query to be refreshed or put into the EclipseLink cache. By default on a read or refresh the object in the cache is refreshed and returned or a new object is built from the database, in some cases such as EJB BMP it is desirable to refresh or load into the object passed into the read object query.

        Note: This forces the selection object into the cache a replaces any existing object that may already be there, this is a strict violation of object identity and other objects can still be referring to the old object.

      • setSingletonSelectionKey

        @Deprecated
        public void setSingletonSelectionKey​(java.lang.Object selectionKey)
        Deprecated.
        since EclipseLink 2.1, replaced by setSelectionId(Object)
        PUBLIC: The primary key can be specified if used instead of an expression or selection object.
        See Also:
        setSelectionId(Object)
      • shouldCheckCacheByExactPrimaryKey

        public boolean shouldCheckCacheByExactPrimaryKey()
        PUBLIC: Return if cache should be checked.
      • shouldCheckCacheByPrimaryKey

        public boolean shouldCheckCacheByPrimaryKey()
        PUBLIC: Return if cache should be checked.
      • shouldCheckCacheThenDatabase

        public boolean shouldCheckCacheThenDatabase()
        PUBLIC: Return if cache should be checked.
      • shouldLoadResultIntoSelectionObject

        public boolean shouldLoadResultIntoSelectionObject()
        PUBLIC: return true if the result should be loaded into the passed in selection Object
      • hasNonDefaultFetchGroup

        protected boolean hasNonDefaultFetchGroup()
        INTERNAL: Return if the query has an non-default fetch group defined for itself.