S2JDBC + Scala でwhere区でInt型の可変引数の場合のこと
- 構成
フレームワーク => SAStruts + S2JDBC
Action => Javaで作成
Service => Scalaで作成
- やりたいこと
JavaのActionからからInt配列を渡して、inで検索する
//Action int[] usercds = new int[]{1,2,3,4,5}; service.findByUsercds(usercds);
//service def findByUsercds(usercds:Array[Int]) = select().where(new SimpleWhere().in("usercd", usercds)).getResultList()
すると、上手く検索が出来ず、例外が発生する。
重大: Servlet.service() for servlet [default] in context with path [/hoge] threw exception [java.lang.NumberFormatException: For input string: "[I@4062b578"] with root cause
と言われる。
探っていくと、inの引数のusercdsが可変引数に、正しく渡っていないっぽい。
ScalaからJavaの可変引数を呼ぶための _*を付けてみると、
def findByUsercds(usercds:Array[Int]) = select().where(new SimpleWhere().in("usercd", usercds:_*)).getResultList()
今度は
overloaded method value in with alternatives: (java.lang.CharSequence,java.util.Collection[_])
org.seasar.extension.jdbc.where.SimpleWhere(java.lang.CharSequence, [java.lang.Object])
org.seasar.extension.jdbc.where.SimpleWhere cannot be applied to (java.lang.String, Int)
(´・ω・`)
オーバーロードが無いと仰る。
色々調べて・・・・。
どうやら、javaの
Object[]
とScalaの
Array[Int]
は相互に使えないらしい。
てゆか、Intの扱いの違いですな。
//Scala、コンパイルエラー val hoge : Object = 1
//Java、正常 Object hoge = 1;
なので、
select().where(new SimpleWhere().in("usercd",usercds.map(new Integer(_)):_*)).getResultList()
とすると、上手く値が取れました。
でも、面倒くさいので、メソッドの引数をArray(Integer)で取るように修正。