【问题标题】:Grails pagination set maximum recordsGrails 分页设置最大记录
【发布时间】:2017-06-26 18:39:17
【问题描述】:

在 groovy 中使用分页时,我希望每页最多 10 个,但我希望查询在达到 500 条记录后返回。

假设我的标准有 10,000 条记录匹配,我希望 PagedResultList 返回 10 并且 results.totalCount = 500 而不是 10,000。

我一直在尝试使用标准中的 maxResults(500) 来执行此操作,但没有成功。用max的时候不能用maxResults吗?

【问题讨论】:

    标签: grails pagination grails-orm


    【解决方案1】:

    max 将返回一个包含您的对象的 ArrayList。

    maxResults 将返回一个PagedResultList,您可以使用totalCount 发出第二个查询来计算符合您条件的对象。 totalCount 是第二个查询 - 它实际上并没有获取所有 10k 个对象。

    所以我不确定如何解决您描述的问题,因为如果查询在您的数据库中匹配 10k,那将是您的总数。如果 totalcount > 500,您可以编写代码检查,显示 500。

    但如果您担心 GORM 正在拉回 10k 个对象,则不是。有关详细信息,请参阅第一个示例 http://docs.grails.org/3.2.10/ref/Domain%20Classes/createCriteria.html

    一个非常简单的控制器来显示行为:

    def index() {
        println "max:"
        def q1 = Foo.createCriteria().list(max: 10) { }
        println q1.class.name
        println q1.totalCount
    
    
        println "maxResults:"
        def q2 = Foo.createCriteria().list {
            maxResults(10)
        }
        println q2.class.name
        // println q2.size() // totalCount doesn't exist on an ArrayList
    }
    

    输出:

    max:
    Hibernate: select this_.id as id1_0_0_, this_.version as version2_0_0_, 
    this_.name as name3_0_0_ from foo this_ limit ?
    grails.orm.PagedResultList
    Hibernate: select count(*) as y0_ from foo this_
    2 
    
    maxResults:
    Hibernate: select this_.id as id1_0_0_, this_.version as version2_0_0_, 
    this_.name as name3_0_0_ from foo this_ limit ?
    java.util.ArrayList
    

    您还可以看到生成的 hql 是相同的,并且为 totalCount 发送了第二个查询。

    希望对您有所帮助。

    【讨论】:

    • 我知道它并没有拉回所有 10k 个对象,但是,它不是完成查询以知道有 10k 个对象......这不是我们获得总数的方式吗?
    • 我不确定“完成查询”是什么意思,数据库运行查询并得到结果。我不知道你所描述的 sql 方法。如果您在索引字段上执行此操作,它应该非常快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多