14

anorm の「on」メソッドのリストを動的に作成することは可能ですか?

オプションの入力を含むフォームがあり、現在、各オプションをチェックし、定義されたオプションを含むリストを作成し、これを anorm に渡そうとしています。現在、このコンパイルエラーが発生します

type mismatch; found : List[java.io.Serializable] required: (Any, anorm.ParameterValue[_])

このリストを作成する方法がわかりません。現在のコード:

val onList = List(
        'school_id = input.school,
        if(input.rooms isDefined)       ('rooms -> input.rooms) else "None" ,
        if(input.bathrooms isDefined)   ('bathrooms -> input.bathrooms) else "None" ,
        if(input.houseType isDefined)   ('houseType -> input.houseType) else "None" ,
        if(input.priceLow isDefined)    ('priceLow -> input.priceLow) else "None" ,
        if(input.priceHigh isDefined)   ('priceHigh -> input.priceHigh) else "None" ,
        if(input.utilities isDefined)   ('utilities -> input.utilities) else "None" 
).filter(_!="None")
SQL("SELECT * FROM Houses WHERE " + whereString).on(onList).as(sqlToHouse *)

最初は同じだと思っていたので、これをやってみました

.on('rooms -> input.rooms, 'bathroom -> input.bathrooms... etc)

編集:

コードは次のとおりです。

val onList = Seq(
        ('school_id -> input.school),
        if(input.rooms isDefined)       ('rooms -> input.rooms.get)         else None ,
        if(input.bathrooms isDefined)   ('bathrooms -> input.bathrooms.get) else None ,
        if(input.houseType isDefined)   ('houseType -> input.houseType.get) else None ,
        if(input.priceLow isDefined)    ('priceLow -> input.priceLow.get)   else None ,
        if(input.priceHigh isDefined)   ('priceHigh -> input.priceHigh.get) else None ,
        if(input.utilities isDefined)   ('utilities -> input.utilities.get) else None 
).filter(_!=None).asInstanceOf[Seq[(Any,anorm.ParameterValue[_])]]

SQL コマンドを使用:

SQL("SELECT * FROM Houses WHERE " + whereString).on(onList:_*).as(sqlToHouse *)

今例外を取得しています

[ClassCastException: java.lang.Integer cannot be cast to anorm.ParameterValue]
4

3 に答える 3

12

重要なことは、 type の値を作成する必要があるということですParameterValue。これは通常、toParameterValue()関数を使用して行われます。

1 つの方法は、平坦化するオプションのシーケンスを作成することです。

val onList = Seq(
  Some('school_id -> input.school),
  input.rooms.map('rooms -> _),
  input.bathrooms.map('bathrooms -> _)
).flatten

このシーケンスは、正しい値にマッピングできます。

SQL(
  "SELECT * FROM Houses WHERE " + whereString
).on(
  onList.map(v => v._1 -> toParameterValue(v._2)): _*
)

これは次のように簡略化できます。

val onList = Seq(
  Some('school_id -> input.school),
  input.rooms.map('rooms -> _),
  input.bathrooms.map('bathrooms -> _)
).flatMap(_.map(v => v._1 -> toParameterValue(v._2)))

SQL(
  "SELECT * FROM Houses WHERE " + whereString
).on(
  onList: _*
)

または、最も簡単な解決策は次のとおりです。

val onList = Seq(
  Some('school_id -> toParameterValue(input.school)),
  input.rooms.map('rooms -> toParameterValue(_)),
  input.bathrooms.map('bathrooms -> toParameterValue(_))
).flatten

SQL(
  "SELECT * FROM Houses WHERE " + whereString
).on(
  onList: _*
)
于 2013-03-25T14:49:27.657 に答える
1

それで、私は何度も電話をかけるだけになりました。

var query = SQL("SELECT * FROM Houses WHERE " + whereString).on('school_id -> input.school)
if(input.rooms isDefined)       query= query.on('rooms -> input.rooms.get)
if(input.bathrooms isDefined)   query= query.on('bathrooms -> input.bathrooms.get)
if(input.houseType isDefined)   query= query.on('houseType -> input.houseType.get)
if(input.priceLow isDefined)    query= query.on('priceLow -> input.priceLow.get)
if(input.priceHigh isDefined)   query= query.on('priceHigh -> input.priceHigh.get)
if(input.utilities isDefined)   query= query.on('utilities -> input.utilities.get)
query.as(sqlToHouse *)
于 2013-03-23T23:53:26.140 に答える
1

次の Anorm (Play 2.3/master で登場) の多値パラメーターを確認できます。

于 2014-05-08T10:47:57.530 に答える