Playframework 2.4 Anormでleft outer join
前回に続き、playframeworkのdataアクセス。
Anormについて学習。テキストはこちら。
AnormはORMではなく、SQLを記述しコレクションに格納する。
SQLなので、テーブルのjoinも、もちろん可能。
ただし、left outer joinで結合される側のテーブルにデータが存在しない場合の
paeserの記述ではまったので備忘として残す。
以下のコードを使用すると
def find(): List[City] = { val parser = long("id") ~ str("name") ~ str("country_name") map { case i ~ n ~ cn => City(i, n, cn, display(n, cn)) } DB.withConnection { implicit c => // get the data val selectQuery = SQL("select a.id, a.name, b.country_name " + "from City a left outer join Country b on a.country_id=b.id") selectQuery.as(parser.*)
CityテーブルとCountryテーブルをjoinするがCountryテーブルに存在しない都市を登録すると、Exceptionが発生。
RuntimeException: ColumnName(Country.country_name,Some(country_name))
Countryテーブルの属性(country_name)をoption型にしなければならない。
parserを以下のように修正。
val parser = long("id") ~ str("name") ~ get[Option[String]]("country_name") map { case i ~ n ~ cn => City(i, n, cast(cn), display(n, cn)) }