玩2.4 Ebean分页问题

Posted

技术标签:

【中文标题】玩2.4 Ebean分页问题【英文标题】:Play 2.4 Ebean pagination issue 【发布时间】:2015-09-03 16:01:54 【问题描述】:

我想在我的应用程序中使用分页。这是一个简单的例子:

public static List<MyClass> getPage(int page, int size) 
    PagedList<MyClass> findPagedList = Ebean.find(MyClass.class).findPagedList(page,size);
    return findPagedList.getList();

当我要求第一页时,我的结果没有问题,但是当我要求第二页时(例如 page=1,size=10),我得到了以下错误

[PersistenceException:查询抛出 SQLException:窗口函数不支持常量作为 ORDER BY 子句表达式。

我正在使用 MsSQL 和数据库服务器。我该如何解决?

谢谢

这里是原始 SQL

select * 
from ( 
    select top 30
        row_number() over (order by null) as rn,
        t0.ID c0, t0.update_date c1, t0.create_date c2,
        t0.code c3, t0.is_fulfilled c4, t0.fulfill_date c5,
        t0.fulfill_request_id c6, t0.app_id c7,
        t0.access_code_header_id c8, t0.product_id c9
    from access_code_details t0
) as limitresult where  rn > 20 and  rn <= 30 

我的数据库配置:

db.default.url="jdbc:sqlserver://127.0.0.1:3333;databaseName=MyDB"
db.default.user=sa
db.default.password="******"
db.default.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
ebean.default.databasePlatform=com.avaje.ebean.config.dbplatform.MsSqlServer2005Platform
ebean.default="model.*"

【问题讨论】:

捕获发送到数据库的实际 SQL 代码并在此处发布。 我已经更新了问题。添加了 SQL。 SQL语法似乎存在真正的问题。当我在 SQL 客户端中运行时,我遇到了同样的错误。那么我应该以某种方式更改此语法吗?谢谢 很好的分页,TOP 30,没有 ORDER BY,row_number 按 NULL 排序。您可以为您的 ORM 或类似的东西更改 SQL Dialect 吗? 检查 persistence.xml 并为 MS SQL 设置方言,如 org.hibernate.dialect.SQLServer2008Dialect 或更高版本(如果可用)。 lad2025,ebean 中 dielect 最接近的配置是 ebean.default.databasePlatform=com.avaje.ebean.config.dbplatform.MsSqlServer2005Platform 没有效果我没有persistence.xml,因为我没有使用休眠 【参考方案1】:

终于明白了。使用分页时,必须在查询中显式定义订单列。

Ebean.find(MyClass.class).order("id").findPagedList(page,size);

但是错误信息完全让我一头雾水。

【讨论】:

静态 Ebean.find 线程安全吗?一直在寻找文档,但我不清楚。【参考方案2】:

使用setFirstRow()setMaxRows()的另一种方式

Model.find.where().setFirstRow(offset).setMaxRows(limit).findList();

Docs

【讨论】:

以上是关于玩2.4 Ebean分页问题的主要内容,如果未能解决你的问题,请参考以下文章

玩!框架+Ebean

playframework 2.4 基本ebean配置

上亿数据怎么玩深度分页?兼容MySQL + ES + MongoDB

Play 2.4 - 在 Eager 单例模块中使用 Ebean

Play Ebean 从 2.4 升级到 2.5 后不生成 Id

Play 2.4 / Ebean / JPA / hibernate-entitymanager 的正确配置是啥?