31.6.7. EJBQL 2.1 and SQL92 queries
The default query compiler does not fully support EJB-QL 2.1 or the SQL92 standard. If you need either of these functions, you can replace the query compiler. The default compiler is specified in
standardjbosscmp-jdbc.xml
.
<defaults> ... <ql-compiler>org.jboss.ejb.plugins.cmp.jdbc.JDBCEJBQLCompiler</ql-compiler> ... </defaults>
To use the SQL92 compiler, simply specify the SQL92 compiler in
ql-compiler
element.
<defaults> ... <ql-compiler>org.jboss.ejb.plugins.cmp.jdbc.EJBQLToSQL92Compiler</ql-compiler> ... </defaults>
This changes the query compiler for all beans in the entire system. You can also specify the ql-compiler for each element in
jbosscmp-jdbc.xml
. Here is an example using one of our earlier queries.
<query>
<query-method>
<method-name>findBadDudes_ejbql</method-name>
<method-params>
lt;method-param>int</method-param>
</method-params>
</query-method>
<ejb-ql><![CDATA[
SELECT OBJECT(g)
FROM gangster g
WHERE g.badness > ?1]]>
</ejb-ql>
<ql-compiler>org.jboss.ejb.plugins.cmp.jdbc.EJBQLToSQL92Compiler</ql-compiler>
</query>
One important limitation of SQL92 query compiler is that it always selects all the fields of an entity regardless the
read-ahead
strategy in use. For example, if a query is configured with the on-load
read-ahead
strategy, the first query will include all the fields, not just primary key fields but only the primary key fields will be read from the ResultSet
. Then, on load, other fields will be actually loaded into the read-ahead cache. The on-find
read-ahead
with the default load group *
works as expected.