[Seasar-user:20930] [S2JDBC] Enum 型カラムのIN条件での検索について

[E-MAIL ADDRESS DELETED] [E-MAIL ADDRESS DELETED]
2011年 7月 29日 (金) 17:29:12 JST


山本と申します。
お世話になっております。

S2JDBCのEnum型カラムのIN条件での検索について質問いたします。

公式ドキュメントを参考に学習テストをしております。
次のように、エンティティが列挙型のカラムについてIN条件で検索すると、
ClassCastExceptionが発生してしまいます。

■失敗するテストコード
/**
 * @throws Exception
 */
public void testWhereJobTypeIn() throws Exception {
    String[] jobTypes = new String[] { "SALESMAN" };
    BeanMap w = new BeanMap();
    w.put("jobType_IN", jobTypes);
    List<Employee> results =
        jdbcManager.from(Employee.class).where(w).getResultList();
    for (Employee e : results) {
        System.out.println(e.name);
    }
}

■発生した例外
java.lang.ClassCastException
        at java.lang.Class.cast(Class.java:2990)
        at 
org.seasar.extension.jdbc.types.EnumOrdinalType.toText(EnumOrdinalType.java:105)
        at 
org.seasar.extension.jdbc.util.BindVariableUtil.getBindVariableText(BindVariableUtil.java:155)
        at 
org.seasar.extension.jdbc.util.BindVariableUtil.getCompleteSql(BindVariableUtil.java:103)
        at 
org.seasar.extension.jdbc.query.AbstractQuery.logSql(AbstractQuery.java:166)
        at 
org.seasar.extension.jdbc.query.AbstractSelect.getResultList(AbstractSelect.java:170)
        ...

ちなみに、次のように、jobTypesをString型の配列ではなくJobType列挙型の配列
で宣言すれば検索できます。
 
■成功するテストコード
/**
 * @throws Exception
 */
public void testWhereJobTypeIn() throws Exception {
    JobType[] jobTypes = new JobType[] { JobType.SALESMAN };
    BeanMap w = new BeanMap();
    w.put("jobType_IN", jobTypes);
    List<Employee> results =
        jdbcManager.from(Employee.class).where(w).getResultList();
    for (Employee e : results) {
        System.out.println(e.name);
    }
}

しかし、SAStruts+S2JDBCで開発する際に、検索条件はActionFormにString型で宣
言する(と思う)ので、
ActionあたりでJobType列挙型に変換しなければなりません。
公式ドキュメントを読むと、なんとなくString型の配列のまま検索ができそうな気
がするのですが…。

このような場合、やはりString型から列挙型に変換しなければならないのでしょう
か?
どなたかアドバイスよろしくお願いいたします。


山本 亮(やまもと りょう)


Seasar-user メーリングリストの案内