resin-ee $ee/ejb-tut/cmp-select.xtp ejbSelect for more EJB-QL queries tutorial select

provides a more flexible method to query the database than find methods. Find methods belong to a home interface and only return the corresponding local object. A method in can only return a or a collection of . methods can return any type in the database or a collection of database objects. They are restricted to the entity bean implementation class; you'll need to write a separate business method to expose the results of the query.

Like find methods, methods use the deployment descriptor to define the EJB-QL query. Resin-CMP will generate the appropriate SQL for the select.

CREATE TABLE select_student ( name VARCHAR(250) NOT NULL, house VARCHAR(250) NOT NULL, gender VARCHAR(6) NOT NULL, PRIMARY KEY(name) ); CREATE TABLE select_house ( name VARCHAR(250) NOT NULL, PRIMARY KEY(name) );

The method for the example is in the class. There are no real limitations on which bean implemenation has the method. All the entity beans in the database are accessible. However, methods are not visible in either the home or the local interfaces. If the bean needs to make the results visible, you'll need to create a business method to collect and return the selected results.

Unlike the find methods, ejbSelect needs an abstract method in the bean implementation. Finds declare the find method in the home interface; selects declare the ejbSelect method in the bean implementation.

public abstract Collection ejbSelectAllBoys(House house) throws FinderException;

The select query is defined in the deployment descriptor like the find query. The following is the query for the example.

SELECT student.name FROM select_house house, IN(house.studentList) student WHERE student.gender='Boy' AND house=?1 ORDER BY student.name

The required SELECT clause may return any cmp-field or cmr-field or any collection of either. In this case we'll return a collection of strings. This return value would be illegal in a find method because a find method could only return (and couldn't return the interface from a method.)

The required FROM clause defines the abstract tables, traversing relations as necessary. In this case, we define the variable to range over all the students in the house. All collection-valued relations will use IN expressions to define a query variables.

The optional WHERE clause can use normal expressions like '=' or boolean expressions. WHERE can use arguments with the '?1' expression.

The optional ORDER BY clause is a Resin-CMP extension to EJB-QL. It orders the select so the boys will be listed alphabetically. Because the ORDER BY clause is so useful, a future version of the EJB 2.0 spec will certainly include it.