Skip Headers

Oracle TopLink Developer's Guide 10g Release 3 (10.1.3) B13593-01 |
| Home | Solution Area | Contents | Index

Previous | Next |

# Parameterized Expressions

A relationship mapping differs from a regular query because it retrieves data for many different objects. To be able to specify these queries, supply arguments when you execute the query. Use the `getParameter` and `getField` methods to acquire values for the arguments.

A parameterized expression executes searches and comparisons based on variables instead of constants. This approach lets you build expressions that retrieve context-sensitive information. This technique is useful when you:

- Create reusable queries (see "Named Queries")

- Define EJB finders (see "EJB Finders")

Parameterized expressions require that the relationship mapping know how to retrieve an object or collection of objects based on its current context. For example, a one-to-one mapping from `Employee` to `Address` must query the database for an address based on foreign key information from the `Employee` table. Each mapping contains a query that TopLink constructs automatically based on the information provided in the mapping. To specify expressions yourself, use the mapping customization mechanisms.

## Expression Method getParameter

The `Expression` method `getParameter` returns an expression that becomes a parameter in the query. This lets enables you create a query that includes user input in the search criteria. The parameter must be either the fully qualified name of the field from a descriptor's row, or a generic name for the argument.

Parameters you construct this way are global to the current query, so you can send this message to any expression object.

Example 97-11 illustrates how to use a custom query to find an employee by first name.

Example 97-11 Using a Parameterized Expression in a Custom Query

    ExpressionBuilder emp = new ExpressionBuilder();
    Expression firstNameExpression;
    firstNameExpression = emp.get("firstName").equal(emp.getParameter("firstName"));
    ReadObjectQuery query = new ReadObjectQuery();
    query.setReferenceClass(Employee.class);
    query.setSelectionCriteria(firstNameExpression);
    query.addArgument("firstName");
    Vector v = new Vector();
    v.addElement("Sarah");
    Employee e = (Employee) session.executeQuery(query, v);

Example 97-12 illustrates how to use a custom query to find all employees that live in the same city as a given employee.

Example 97-12 Using Nested Parameterized Expressions

    ExpressionBuilder emp = new ExpressionBuilder();
    Expression addressExpression;
    addressExpression = emp.get("address").get("city").equal(emp.getParameter("employee").get("address").get("city"));
    ReadObjectQuery query = new ReadObjectQuery(Employee.class);
    query.setName("findByCity");
    query.setReferenceClass(Employee.class);
    query.setSelectionCriteria(addressExpression);
    query.addArgument("employee");
    Vector v = new Vector();
    v.addElement(employee);
    Employee e = (Employee) session.executeQuery(query, v);

Example 97-13 illustrates how to obtain a simple one-to-many mapping from class `PolicyHolder` to `Policy` using a nondefault selection criteria. The SSN field of the POLICY table is a foreign key to the SSN field of the HOLDER table.

Example 97-13 Using a Parameterized Expression in a Mapping

    OneToManyMapping mapping = new OneToManyMapping();
    mapping.setAttributeName("policies");
    mapping.setGetMethodName("getPolicies");
    mapping.setSetMethodName("setPolicies");
    mapping.setReferenceClass(Policy.class);

    // Build a custom expression here rather than using the defaults
    ExpressionBuilder policy = new ExpressionBuilder();
    mapping.setSelectionCriteria(policy.getField("POLICY.SSN")).equal(policy.
      getParameter("HOLDER.SSN")));

## Expression Method getField

The `Expression` method `getField` returns an expression that represents a database field with the given name. Use this method to construct the selection criteria for a mapping. The argument is the fully qualified name of the required field. Because fields are not global to the current query, you must send this method to an expression that represents the table from which this field is derived. See also "Data Queries and Expressions" .

Example 97-14 illustrates how to use the `Expression` method `getField`.

Example 97-14 Using Expression Method getParameter

    ExpressionBuilder address = new ExpressionBuilder();
    Expression exp = address.getField("ADDRESS.EMP_ID").equal(
        address.getParameter("EMPLOYEE.EMP_ID")
    );
    exp = exp.and(address.getField("ADDRESS.TYPE").equal(null));