いままではJava版のインターフェースを踏襲してClassオブジェクトを渡すようにしていたのですが…
val books = sqlManager.getResultList( classOf[Book], // ここでエンティティの型を指定 Sql(""" SELECT BOOK_ID, BOOK_NAME, AUTHOR, PRICE FROM BOOK /*IF author!=null*/ WHERE AUTHOR = /*author*/ /*END*/ """), Map("author"->"Naoki Takezoe"))
ScalaではManifestを使うと型パラメータの情報を取得することができるので、これを使って以下のように書けるようにしてみました。こっちのほうがScalaっぽい気がします。
val books = sqlManager.getResultList[Book]( // 型パラメータで指定 Sql(""" SELECT BOOK_ID, BOOK_NAME, AUTHOR, PRICE FROM BOOK /*IF author!=null*/ WHERE AUTHOR = /*author*/ /*END*/ """), Map("author"->"Naoki Takezoe"))
ただ、問題はiterateメソッドです。このメソッドはエンティティと戻り値の型が型パラメータになっており、これまではエンティティの型はClassオブジェクト、戻り値の型はコールバック関数の戻り値の型から推論する形になっていたのですが、上記の修正を適用すると以下のような感じで戻り値の型も型パラメータに明記しないといけなくなってしまいます。
val result = sqlManager.iterate[Book, Int]( Sql(""" SELECT BOOK_ID, BOOK_NAME, AUTHOR, PRICE FROM BOOK """), 0) { (book, sum) => sum + book.price }
まあ、これは仕方ないんですかねぇ…。