30.6.2. EJB-QL 宣言

select または finder メソッド(findByPrimaryKey を除く)には ejb-jar.xml ファイルで定義した EJB-QL クエリが必要です。EJB-QL クエリは、エンティティ要素に含まれるクエリ要素で宣言します。以下に findBadDudes_ejbql および ejbSelectBoss_ejbql クエリの宣言を示します。
<ejb-jar>
    <enterprise-beans>
        <entity>
            <ejb-name>GangsterEJB</ejb-name> 
            <!-- ... -->
            <query>
                <query-method>
                    <method-name>findBadDudes_ejbql</method-name>
                    <method-params>
                        <method-param>int</method-param>
                    </method-params>
                </query-method>
                <ejb-ql><![CDATA[
                 SELECT OBJECT(g) FROM gangster g WHERE g.badness > ?1
                 ]]></ejb-ql>
            </query>
            <query>
                <query-method>
                    <method-name>ejbSelectBoss_ejbql</method-name>
                    <method-params>
                        <method-param>java.lang.String</method-param>
                    </method-params>
                </query-method>
                <ejb-ql><![CDATA[
                 SELECT DISTINCT underling.organization.theBoss FROM gangster underling WHERE underling.name = ?1 OR underling.nickName = ?1
                 ]]></ejb-ql>
            </query>
        </entity>
    </enterprise-beans>
</ejb-jar>
EJB-QL は SQL に似ていますが、驚くような違いがあります。以下に EJB-QL に関する注意事項を紹介します。
  • EJB-QL は型付言語で、つまり類似する型の比較しかできません(例:ストリングはストリングとの比較しかできないなど)。
  • 同値比較では、変数(一価パス)は左側に記載する必要があります。以下に例を示します。
g.hangout.state = 'CA' Legal
'CA' = g.shippingAddress.state NOT Legal
'CA' = 'CA' NOT Legal
(r.amountPaid * .01) > 300 NOT Legal
r.amountPaid > (300 / .01) Legal
  • パラメーターは java.sql.PreparedStatement のようにベース 1 インデックスを使用します。
  • パラメーターは比較の右側に必ず記載されます。以下に例を示します。
gangster.hangout.state = ?1 Legal
?1 = gangster.hangout.state NOT Legal