30.6.5. DynamicQL

DynamicQL はランタイム生成と JBossQL クエリの実行を可能にします。DynamicQL クエリメソッドは抽象メソッドで、JBossQL とクエリ引数をパラメーターとして取り込みます。JBoss は JBossQL をコンパイルし、生成済み SQL を実行します。以下は、州一覧の中の任意の州に存在する gangster を選択する JBossQL クエリを生成するものです。
public abstract class GangsterBean 
    implements EntityBean 
{
    public Set ejbHomeSelectInStates(Set states)
        throws FinderException
    {
        // generate JBossQL query
        StringBuffer jbossQl = new StringBuffer();
        jbossQl.append("SELECT OBJECT(g) ");
        jbossQl.append("FROM gangster g ");
        jbossQl.append("WHERE g.hangout.state IN (");

        for (int i = 0; i < states.size(); i++) {
            if (i > 0) {
                jbossQl.append(", ");
            }

            jbossQl.append("?").append(i+1);
        }

	    jbossQl.append(") ORDER BY g.name");

        // pack arguments into an Object[]
        Object[] args = states.toArray(new Object[states.size()]);
 
        // call dynamic-ql query
        return ejbSelectGeneric(jbossQl.toString(), args);
    }
}
DynamicQL select メソッドには有効な select メソッド名が複数ありますが、このメソッドではストリングとオブジェクトアレイをパラメーターとして取る必要があります。DynamicQL は dynamic-ql 要素付きの jbosscmp-jdbc.xml ファイルで宣言します。以下に ejbSelectGenericの宣言を示します。
<jbosscmp-jdbc>
    <enterprise-beans>
        <entity>
            <ejb-name>GangsterEJB</ejb-name>
            <query>
                <query-method>
                    <method-name>ejbSelectGeneric</method-name>
                    <method-params>
                        <method-param>java.lang.String</method-param>
                        <method-param>java.lang.Object[]</method-param>
                    </method-params>
                </query-method>
                <dynamic-ql/>
            </query>
        </entity>
    </enterprise-beans>
</jbosscmp-jdbc>