【发布时间】:2014-11-10 09:07:57
【问题描述】:
我在我们的应用程序中使用 Slick 连接到 Postgres 数据库。我有一个通用的过滤逻辑,其中一个过滤器对象将从 UI 传递,它应该返回带有分页的结果。 Filter 对象应该是通用的,以便可以重复使用。 过滤器对象的伪代码如下:
Filter = {
type: table
prop: List_of_conditions
page : 1
size : 10
}
目前,我正在从 Filter 对象构建本机 SQL 并执行它。但是,在实际执行查询之前,我无法使用take 和drop。它目前正在获取所有结果,然后删除不必要的记录。
我知道如何使用 slick 查询来做到这一点,但不确定如何将分页与本机查询一起使用?
val res = StaticQuery.queryNA[Entity](queryStr).list.drop((filter.pageNo- 1) * filter.pageSize).take(filter.pageSize)
我正在使用Slick 2.1
【问题讨论】:
-
静态查询的问题是你可以在里面写任何东西,比如假设你有这个查询:
SELECT * FROM myTable LIMIT 10,那么你要求slick添加一个GROUP BY子句,slick不能保证子句的顺序(因此您的 SQL 中没有语法错误),实际上没有可用于静态查询的常用方法,您必须在queryStr参数中构建它。 -
hmm :( 有没有办法将
where condition string转换成光滑的表达式? -
为什么不使用普通的流畅语法?这个查询看起来并不复杂,以至于您需要纯 SQL,查询中使用的功能都可以在 slick 库中使用。
-
@EndeNeu,您能否给我看一个示例以从过滤器对象构建光滑的表达式?我最近从java切换到scala,还没有完全进入scala的方式。
-
不完全允许用户查询任何表。只是为了明确我的要求,我会解释一下。有特定的休息端点允许使用分页进行过滤。在 REST 控制器端,将过滤器 json 转换为过滤器对象,然后设置一个用于指定表的字段(即允许的表在 REST 控制器中设置,用户没有权限)。用户将只提供过滤所需的 where 条件以及页面大小和页码。希望我能够解释requiremtn
标签: postgresql scala pagination slick