30.6.7. EJBQL 2.1 と SQL92 のクエリ
デフォルトのクエリーコンパイラは、EJB-QL 2.1 または the SQL92 規格に完全対応していません。このうちいずれかが必要な場合、クエリコンパイラーを交換してください。デフォルトのコンパイラーは
standardjbosscmp-jdbc.xml
に指定しています。
<defaults> ... <ql-compiler>org.jboss.ejb.plugins.cmp.jdbc.JDBCEJBQLCompiler</ql-compiler> ... </defaults>
SQL92 コンパイラーを使用するには、単に
ql-compiler
要素で SQL92 コンパイラーを指定するだけです。
<defaults> ... <ql-compiler>org.jboss.ejb.plugins.cmp.jdbc.EJBQLToSQL92Compiler</ql-compiler> ... </defaults>
これにより、システム全体の bean すべてに対し、クエリコンパイラーが変更されます。また、各要素に対するクエリコンパイラーを
jbosscmp-jdbc.xml
で指定することもできます。初期のクエリの一つを使用した例を以下に紹介します。
<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>
SQL92 クエリコンパイラーの制限事項で重要な点は、使用する
read-ahead
ストラテジに関わらず、エンティティの全フィールドを選択することです。たとえば、クエリがon-load
read-ahead
ストラテジで設定されている場合、最初のクエリには全フィールドが含まれ、プライマリキーフィールドだけが ResultSet
から読み込まれます。次に、他のフィールドは先読みキャッシュにロードされます。デフォルトのロードグループ*
を備えた on-find
read-ahead
は 期待通りに動作します。