Module eclipselink

Class MethodBaseQueryRedirector

  • All Implemented Interfaces:
    Serializable, QueryRedirector

    public class MethodBaseQueryRedirector
    extends Object
    implements QueryRedirector

    Purpose:

    Allows a class to be a QueryRedirector without implementing QueryRedirector.

    Description:

    Normally to define a Redirector a Class must implement QueryRedirector and the required QueryRedirector.invokeQuery(DatabaseQuery, Record, Session).

    To maintain transparency it is possible to instead only define a static method that takes the same arguments as invokeQuery.

    An instance of MethodBaseQueryRedirector can be constructed, taking the name of that static method and the Class in which it is defined as parameters.

    Whenever invokeQuery is called on this instance reflection will automatically be used to invoke the custom method instead.

    Advantages:
    • The Redirector class and method name can be specified dynamically.
    • The class containing the invokeQuery method does not need to implement QueryRedirector.
    • The invokeQuery method can have any name.
    • The invokeQuery method can alternatively be defined to accept only Session session and Vector arguments as parameters.
    Disadvantages:
    • An extra step is added as the real invokeQuery method is called dynamically.

    Example:

     // First create a named query, define a redirector for it, and add the query
     // to the query manager.
     ReadObjectQuery query = new ReadObjectQuery(Employee.class);
     query.setName("findEmployeeByAnEmployee");
     query.addArgument("employee");
    
     MethodBaseQueryRedirector redirector = new
     MethodBaseQueryRedirector(QueryRedirectorTest.class, "findEmployeeByAnEmployee");
     query.setRedirector(redirector);
     ClassDescriptor descriptor = getSession().getDescriptor(query.getReferenceClass());
     descriptor.getQueryManager().addQuery(query.getName(), query);
    
     // Now execute the query by name, passing in an Employee as an argument.
     Vector arguments = new Vector();
     arguments.addElement(employee);
     objectFromDatabase =
     getSession().executeQuery("findEmployeeByAnEmployee", Employee.class, arguments);
    
     // Note this Class does not implement QueryRedirector or method invokeQuery.
     public class QueryRedirectorTest {
     public static Object findEmployeeByAnEmployee(DatabaseQuery query, Record arguments, Session session) {
     ((ReadObjectQuery) query).setSelectionObject(arguments.get("employee"));
     return session.executeQuery(query);
     }
     }
    See Also:
    QueryRedirector, Serialized Form
    Author:
    James Sutherland
    Since:
    TOPLink/Java 3.0
    • Field Detail

      • methodClass

        protected Class<?> methodClass
      • methodClassName

        protected String methodClassName
      • methodName

        protected String methodName
      • method

        protected transient Method method
    • Constructor Detail

      • MethodBaseQueryRedirector

        public MethodBaseQueryRedirector()
        PUBLIC: Returns a new query redirector.
      • MethodBaseQueryRedirector

        public MethodBaseQueryRedirector​(Class<?> methodClass,
                                         String methodName)
        PUBLIC: Returns a new query redirector based on the static method in methodClass.
    • Method Detail

      • getMethod

        protected Method getMethod()
        INTERNAL: Returns the static method.
      • getMethodClass

        public Class<?> getMethodClass()
        PUBLIC: Returns the class to execute the static method on.
      • getMethodClassName

        public String getMethodClassName()
        INTERNAL: Returns the class to execute the static method on.
      • getMethodName

        public String getMethodName()
        PUBLIC: Returns the name of the static method. This method must be public, static and have argument of DatabaseQuery, Vector, Session.
        See Also:
        setMethodName(java.lang.String)
      • setMethod

        protected void setMethod​(Method newMethod)
        INTERNAL: Sets the static method.
      • setMethodClass

        public void setMethodClass​(Class<?> newMethodClass)
        PUBLIC: Sets the class to execute the static method on.
      • setMethodClassName

        public void setMethodClassName​(String newMethodClassName)
        INTERNAL: Sets the class to execute the static method on.
      • setMethodName

        public void setMethodName​(String newMethodName)
        PUBLIC: Sets the name of the static method.

        This method must be public, static and have arguments of DatabaseQuery, Record, and Session.

        The DatabaseQuery argument is the query that is currently being executed.

        The Record will contain the Argument names added to the Query through addArgument(Sting) or, in the case of an Object query, the object attribute field names. These names will reference the argument values passed into the query, or in the case of an Object Query the values from the object.

        The session argument is the session that the query is currently being executed on.

        Alternatively the method can take only (Session session, Vector arguments) as parameters.