Class MethodBaseQueryRedirector
- All Implemented Interfaces:
Serializable
,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 implementQueryRedirector
. - The
invokeQuery
method can have any name. - The
invokeQuery
method can alternatively be defined to accept onlySession session
andVector arguments
as parameters.
- 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:
- Author:
- James Sutherland
-
Field Summary
-
Constructor Summary
ConstructorDescriptionPUBLIC: Returns a new query redirector.MethodBaseQueryRedirector
(Class methodClass, String methodName) PUBLIC: Returns a new query redirector based on the static method in methodClass. -
Method Summary
Modifier and TypeMethodDescriptionprotected Method
INTERNAL: Returns the static method.PUBLIC: Returns the class to execute the static method on.INTERNAL: Returns the class to execute the static method on.PUBLIC: Returns the name of the static method.protected void
initializeMethod
(DatabaseQuery query) INTERNAL: Set the method.invokeQuery
(DatabaseQuery query, Record arguments, Session session) INTERNAL: Call the static method to execute the query.protected void
INTERNAL: Sets the static method.void
setMethodClass
(Class newMethodClass) PUBLIC: Sets the class to execute the static method on.void
setMethodClassName
(String newMethodClassName) INTERNAL: Sets the class to execute the static method on.void
setMethodName
(String newMethodName) PUBLIC: Sets the name of the static method.
-
Field Details
-
methodClass
-
methodClassName
-
methodName
-
method
-
-
Constructor Details
-
MethodBaseQueryRedirector
public MethodBaseQueryRedirector()PUBLIC: Returns a new query redirector. -
MethodBaseQueryRedirector
PUBLIC: Returns a new query redirector based on the static method in methodClass.
-
-
Method Details
-
getMethod
INTERNAL: Returns the static method. -
getMethodClass
PUBLIC: Returns the class to execute the static method on. -
getMethodClassName
INTERNAL: Returns the class to execute the static method on. -
getMethodName
PUBLIC: Returns the name of the static method. This method must be public, static and have argument of DatabaseQuery, Vector, Session.- See Also:
-
initializeMethod
INTERNAL: Set the method.- Throws:
QueryException
-
invokeQuery
INTERNAL: Call the static method to execute the query.- Specified by:
invokeQuery
in interfaceQueryRedirector
-
setMethod
INTERNAL: Sets the static method. -
setMethodClass
PUBLIC: Sets the class to execute the static method on. -
setMethodClassName
INTERNAL: Sets the class to execute the static method on. -
setMethodName
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.
-