For finder and select queries, the syntax of the SELECT clause is as follows:
SELECT [ ALL | DISTINCT ] { single-valued-path-expression | OBJECT ( identification-variable ) }
The SELECT clause consists of either a single identification variable that is defined in the FROM clause or a single valued path expression that evaluates to a object reference or CMP value. The keyword DISTINCT can be used to eliminate duplicate references.
For a query that defines a finder method the query must return an object type consistent with the home for which the finder method associated with the query. In other words, a finder method for a department home can not return employee objects.
For dynamic queries the syntax is as follows:
SELECT { ALL | DISTINCT } [ selection , ]* selection selection ::= { expression [[AS] id ] | scalar-subselect }
A scalar-subselect is a subselect that returns a single value.
Example: SELECT clause
Find all employees that earn more than John:
SELECT OBJECT(e) FROM EmpBean ej, EmpBean e WHERE ej.name = 'John' and e.salary > ej.salary
Find all departments that have one or more employees who earn less than 20000:
SELECT DISTINCT e.dept FROM EmpBean e where e.salary < 20000
A select method query can have a path expression that evaluates to an arbitrary value:
SELECT e.dept.name FROM EmpBean e where e.salary < 2000
The above query returns a collection of name values for those departments having employees earning less than 20000.
Example: Valid dynamic queries
The following are examples of dynamic queries:
SELECT e.name, e.salary+e.bonus as total_pay from EmpBean e
SELECT SUM( e.salary+e.bonus) from EmpBean e where e.dept.deptno = ?1