# Class IndirectQuery

java.lang.Object
org.apache.cayenne.query.IndirectQuery

All Implemented Interfaces:
  `Serializable, Query`

Direct Known Subclasses:
  `AbstractMappedQuery, ObjectIdQuery, ProcedureCall, RelationshipQuery, SelectById, SQLExec, SQLSelect`

public abstract class IndirectQuery extends Object implements Query
A base superclass for queries that resolve into some other queries during the routing phase. Provides caching of a replacement query.

Since:
  1.2
See Also:
  - Serialized Form

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `protected DataMap`
  `dataMap`
  `protected EntityResolver`
  `lastResolver`
  `protected String`
  `name`
  `protected Query`
  `replacementQuery`

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `IndirectQuery()`

- ## Method Summary

  Modifier and Type
  Method
  Description
  `protected abstract Query`
  `createReplacementQuery(EntityResolver resolver)`
  Creates a substitute query.
  `SQLAction`
  `createSQLAction(SQLActionVisitor visitor)`
  Throws an exception as indirect query should not be executed directly.
  `QueryMetadata`
  `getMetaData(EntityResolver resolver)`
  Returns the metadata obtained from the replacement query.
  `protected Query`
  `getReplacementQuery(EntityResolver resolver)`
  Returns a replacement query, creating it on demand and caching it for reuse.
  `void`
  `route(QueryRouter router, EntityResolver resolver, Query substitutedQuery)`
  Delegates routing to a replacement query.

  ### Methods inherited from class Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- ## Field Details

  - ### name

    protected String name

  - ### dataMap

    protected DataMap dataMap
    Since:
      3.1

  - ### replacementQuery

    protected transient Query replacementQuery

  - ### lastResolver

    protected transient EntityResolver lastResolver

- ## Constructor Details

  - ### IndirectQuery

    public IndirectQuery()

- ## Method Details

  - ### getMetaData

    public QueryMetadata getMetaData(EntityResolver resolver)
    Returns the metadata obtained from the replacement query.
    Specified by:
      `getMetaData` in interface `Query`

  - ### route

    public void route(QueryRouter router, EntityResolver resolver, Query substitutedQuery)
    Delegates routing to a replacement query.
    Specified by:
      `route` in interface `Query`

  - ### createReplacementQuery

    protected abstract Query createReplacementQuery(EntityResolver resolver)
    Creates a substitute query. An implementor is free to provide an arbitrary replacement query.

  - ### getReplacementQuery

    protected Query getReplacementQuery(EntityResolver resolver)
    Returns a replacement query, creating it on demand and caching it for reuse.

  - ### createSQLAction

    public SQLAction createSQLAction(SQLActionVisitor visitor)
    Throws an exception as indirect query should not be executed directly.
    Specified by:
      `createSQLAction` in interface `Query`