【问题标题】:Pagination with native query in slick在 slick 中使用本机查询进行分页
【发布时间】:2014-11-10 09:07:57
【问题描述】:

我在我们的应用程序中使用 Slick 连接到 Postgres 数据库。我有一个通用的过滤逻辑,其中一个过滤器对象将从 UI 传递,它应该返回带有分页的结果。 Filter 对象应该是通用的,以便可以重复使用。 过滤器对象的伪代码如下:

Filter = {
type: table
prop: List_of_conditions
page : 1
size : 10
}

目前,我正在从 Filter 对象构建本机 SQL 并执行它。但是,在实际执行查询之前,我无法使用takedrop。它目前正在获取所有结果,然后删除不必要的记录。 我知道如何使用 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


【解决方案1】:

当您使用纯 sql 时,您不能使用集合运算符来构建查询。您必须在 SQL 中完成所有操作:

val limit = filter.pageSize
val offset = (filter.pageNo- 1) * filter.pageSize
val res = StaticQuery.queryNA[Entity](queryStr ++ s" LIMIT $limit OFFSET $offset").list

【讨论】:

    【解决方案2】:

    我尚未对其进行测试,但我建议您尝试将 .list 呼叫移至末尾

    val res = StaticQuery.queryNA[Entity](queryStr).drop((filter.pageNo- 1) * filter.pageSize).take(filter.pageSize).list
    

    【讨论】:

    • 不,这不起作用,因为 queryNA 没有 drop 和 take 方法
    猜你喜欢
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    相关资源
    最近更新 更多