UNLIMITED JAVA

WEB技術や普段の生活のブログ

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)で取るように修正。