【发布时间】:2019-01-25 08:26:11
【问题描述】:
我必须使用参数值将or 条件添加到查询中。
示例:select * from users where email = "abc@xyz.com" or phone="1234123412";
用户可以发送两个字段或只发送一个。我想在每个字段的循环中执行此操作,并将它们中的每一个添加到or where 条件中。
val query = Users.selectAll()
**var predicates = Op.build { Users.id inList listOf<Int>()}**
for((k, v) in params) {
val value = URLDecoder.decode(v.first(), "UTF-8")
predicates = when(k) {
"email" -> predicates.or(Users.email eq value)
"phone" -> predicates.or(Users.phone eq value)
}
}
query.andWhere { predicates }
上面的 DSL 产生下面的 SQL。
SELECT * from users where (((false = true) OR (users.email = "abc@xyz.com")) OR (users.phone = "1234567890"))
看到false = true了吗?那是因为,要使用.or 方法,我必须使用条件进行初始化。下面给出的 sn-p 是添加用于初始化谓词的不必要的代码行。
var predicates = Op.build { Users.id inList listOf<Int>()}
什么是初始化它的正确方法,以便我可以无缝地将多个or 和and 谓词添加到查询中?
【问题讨论】:
-
AFAIK 几乎所有最终创建 SQL 的框架/库都使用这种子句。从 DSL 的角度来看,它们只是更好。如果存在 0 或 1 个条件,它们会删除对
or和and的特殊处理。 SQL 引擎将简单地忽略它们,因此没有真正的缺点。只需查看由 hibernate 生成的查询。它们充满了1=0和1=1之类的东西。因此,您可能无法轻松删除它们。
标签: kotlin kotlin-exposed