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-loadread-ahead ストラテジで設定されている場合、最初のクエリには全フィールドが含まれ、プライマリキーフィールドだけが ResultSet から読み込まれます。次に、他のフィールドは先読みキャッシュにロードされます。デフォルトのロードグループ* を備えた on-findread-ahead は 期待通りに動作します。