gpt4 book ai didi

postgresql - 在 PostgreSQL 9.0 中破坏的 Anorm 使用 Order By 选择?

转载 作者:行者123 更新时间:2023-11-29 11:43:52 25 4
gpt4 key购买 nike

我正在尝试构建一个类似于“计算机”示例中的列表页面。我的环境是Play 2.0和PostrgreSQL 9.0

我的用户对象中有以下方法:

 def list(page: Int = 0, pageSize: Int = 10, orderBy: Int = 1, filter: String = "%"): Page[User] = {
val offset = pageSize * page
val mode = if (orderBy > 0) "ASC NULLS FIRST" else "DESC NULLS LAST"

Logger.debug("Users.list with params: page[%d] pageSize[%d] orderBy[%d] filter[%s] order[%s]".format(page, pageSize, orderBy, filter, mode))

DB.withConnection {
implicit connection =>

val users = SQL(
"""
select * from publisher
where name ilike {filter}
order by {orderBy} %s
limit {pageSize} offset {offset}
""".format(mode)
).on(
'pageSize -> pageSize,
'offset -> offset,
'filter -> filter,
'orderBy -> scala.math.abs(orderBy)
).as(User.simple *)

val totalRows = SQL(
"""
select count(*) from publisher
where name like {filter}
"""
).on(
'filter -> filter
).as(scalar[Long].single)

Page(users, page, offset, totalRows)
}

}

无论我提供哪个“orderBy”值,顺序始终基于实体的 ID。

Anorm 生成的查询是有效的 PostgreSQL,直接对数据库运行时它工作正常。但似乎 Anorm 解析器忽略了返回结果的顺序,而是返回按“id”排序的列表。

我什至尝试将查询简化为 "select * from publisher order by 2 ASC/DESC" ,但没有什么是固定的,Anorm 在返回时忽略了排序。

关于如何解决这个问题有什么建议吗?

最佳答案

感谢 Play 邮件列表中的 Guillaume,我找到了解决方法。

除 order by 之外的所有占位符都有效。更糟糕的是,当您关注日志时,驱动程序会生成正确的查询,而 PostgreSQL 正在接收它。我不确定这是怎么回事,非常困惑,但如果我删除该占位符,它就可以正常工作。

郁闷:(

我是这样解决的:

val users = SQL(
"""
select * from publisher
where name ilike {filter}
order by %d %s
limit {pageSize} offset {offset}
""".format(scala.math.abs(orderBy), mode)
).on(
'pageSize -> pageSize,
'offset -> offset,
'filter -> filter
).as(User.simple *)

现在你会尖叫“SQL INJECTION”。放松。尽管可能以某种方式实现,orderBy 是一个整数(为了更安全,我们将其转换为 abs 值)。如果您尝试使用字符串调用提供 orderBy 的 Controller ,Play 将返回 404 错误。所以只允许整数。如果没有与给定整数对应的列,则忽略 order by。所以,不是很理想,但也不是很糟糕。

关于postgresql - 在 PostgreSQL 9.0 中破坏的 Anorm 使用 Order By 选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9778185/

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