gpt4 book ai didi

sql - 使用 Anorm 和 Scala Play 框架的动态 SQL 参数

转载 作者:行者123 更新时间:2023-12-03 22:27:31 24 4
gpt4 key购买 nike

是否可以为 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]

最佳答案

重要的是您必须创建类型 ParameterValue 的值。 .
这通常使用 toParameterValue() 完成。功能。

一种方法是创建一系列您可以展平的选项:

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: _*
)

关于sql - 使用 Anorm 和 Scala Play 框架的动态 SQL 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15591479/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com