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