Playも勉強したてでScalaもコップ本勉強中な身ですが、いろいろな切り口でPlay20とScalaを試しています。とはいうものの、普通に簡単な処理を書くくらいはできるようになってきたのですが、わからないことが出てくると詰まってしまいますね。
で、そんなわからないことの中でも連日ネットでサンプルをあさったりドキュメント見たりしているのが下記のようなAnormで動的にパラメータクエリを生成してSQLを実行する方法です。
[sourcecode language="scala"] var sql = """ SELECT id, | col_a, | col_b, | FROM sample | WHERE id >= {id} | """
var condition:String = ""
if (a != ""){
condition += " col_a = {col_a} AND "
}
if (b != ""){
condition += " col_b = {col_b} AND "
}
if (condition != ""){
// 条件句の生成(終わりのANDを取り除き、Whereを追加する)
sql += " where " + condition.trim().substring(condition.length-3, condition.length)
}
val statement:SqlQuery = SQL(sql)
// note:ここでとのようにパラメータを渡すかがわからない…
val query:SimpleSql[Row] = statement.on()
…以下略
[/sourcecode]
ふつーにパラメータの個数が変動しない場合はプレースフォルダを指定して渡せばいいわけですが、今回のように条件によってパラメータの個数が変動する場合、どうやってパラメータを指定すればよいかわからないのです。
C#だと以下のような感じでSqlCommandクラスの中にあるParameterへセットすればいいわけですが、、、
[sourcecode language="csharp"]
command.Parameters.Add("@col_a", a);
[/sourcecode]
で、そもそもSimpleSqlクラスのonメソッドではAnyとanorm.ParameterValue[_]の配列をセットすればいいわけなのでこれを作成してみようとしたのですが、anorm.ParameterValueがいまいちわからないわけです。anormの該当部分のソースコードを読んでも??って感じなのでもう少しいろいろと試してみますか…。