カスタム検索メソッドは、デフォルトの findByPrimaryKey メソッドではなく、findBy メソッドです。このメソッドはエンティティー Bean のホームインタフェース内で定義することができます。EJB 1.1 仕様では、これらの検索メソッドのロジックを定義する標準が規定されていないため、EJB サーバーのベンダーは実装を自由に選択できます。この結果、メソッドの定義に使用される手順は、ベンダーの選択するさまざまな実装によって大きく異なっています。
Sun ONE Application Server 6.x では、標準の SQL を使用して検索ロジックを指定します。
この検索メソッドの定義に関する情報は、エンタープライズ Bean の持続性記述子 (Account-ias-cmp.xml) 内に、次のように格納されています。
<bean-property>
<property>
<name>findOrderedAccountsForCustomerSQL</name>
<type>java.lang.String</type>
<value>
SELECT BRANCH_CODE,ACC_NO FROM ACCOUNT where CUST_NO = ?
</value>
<delimiter>,</delimiter>
</property>
</bean-property>
<bean-property>
<property>
<name>findOrderedAccountsForCustomerParms</name>
<type>java.lang.Vector</type>
<value>CustNo</value>
<delimiter>,</delimiter>
</property>
</bean-property>
このように、各 findXXX 検索メソッドには、配備記述子内に対応する 2 つのエントリ (クエリー用の SQL コードと関連するパラメータ) が存在しています。
Sun Java System Application Server 8.2 ではカスタム検索メソッドのロジックも宣言型ですが、これは EJB QL (EJB query language) に基づいています。
EJB-QL 言語はそれ自身に対して使用することはできません。ファイル ejb-jar.xml にある <ejb-ql> タグ内で指定する必要があります。このタグは <query> タグの内部にあります。これは、EJB 内部でクエリー (検索または選択メソッド) を定義するタグです。EJB コンテナでは、各クエリーを検索または選択メソッドの実装に変換することができます。次に <ejb-ql> タグの例を示します。
<ejb-jar>
<enterprise-beans>
<entity>
<ejb-name>hotelEJB</ejb-name>
...
<abstract-schema-name>TMBankSchemaName</abstract-schema-name>
<cmp-field>
...
<query>
<query-method>
<method-name>findByCity</method-name>
<method-params>
<method-param>java.lang.String</method-param>
</method-params>
</query-method>
<ejb-ql>
<![CDATA[SELECT OBJECT(t) FROM TMBankSchemaName AS t
WHERE t.city = ?1]]>
</ejb-ql>
</query>
</entity>
...
</enterprise-beans> ...
</ejb-jar>