mirage-scalaでのDTOの扱い

mirage-scalaを作っているわけですが、2waySQLのパラメータを渡したり、検索結果を受け取るためのDTOをどうしようかというのが目下最大の悩み。今のMirageのインターフェースをそのまま使うならこんな感じになります。

// ResultSetをマッピングするクラス
class Book {
  @BeanProperty
  var bookId: Long = 0
  @BeanProperty
  var bookName: String = null
  @BeanProperty
  var author: String = null
  @BeanProperty
  var price:Int = 0
}

// パラメータとして渡すクラス
class BookParam(@BeanProperty var bookName: String)

// こんな感じで実行
val resultList: List[Book] = sqlManager.getResultList(classOf[Book], 
  TwoWaySql("""
    SELECT BOOK_ID, BOOK_NAME, AUTHOR, PRICE
    FROM BOOK
    /*IF bookName != null*/
      WHERE BOOK_NAME=/*bookName*/'Mirage in Action'
    /*END*/
  """), new BookParam("Mirage in Action"))

問題点は以下のような感じでしょうか。

  • @BeanPropertyアノテーションがあれ。でも、Mirage本体に手を入れれば付けなくてもいける。
  • varなのがあれ(この例だとパラメータクラスのほうはvalにできるけど)。コンストラクタでプロパティの値を渡すようにすればvalにできるけどMirage本体に結構な改修が必要になりそう。
  • プロパティの型にOptionも使えるようにしたほうがいい?でもDB上ではNULLという表現が存在するわけでそれを隠蔽するのは違う気もする。

プロパティをvarにすべきかvalにすべきかは検討の余地があるかも。たとえばパラメータや検索結果のDTOだけならコンストラクタで値を受け取ってプロパティをvalにするのがいい気がするけど、エンティティだとSELECTして一部のプロパティを変更してUPDATEするケースが考えられるので、そういう場合はvarのほうが便利。とか。
というわけで、Mirage本体では以下のようにしておくといい気がしてきました。

んで、DTOやエンティティではvalにしたければコンストラクタで受け取るようにすればいいし、varにしたい場合はフィールドだけ宣言すればいい、みたいな。まあ要するに考えるのがめんどくさいのでどっちもできるようにしておけばいいじゃん!ということなわけですが。