Grails Pagination

时间:2013-05-08 16:02:31

标签: grails pagination

你好我回来了另一个乏味的问题!

尝试让我的表分页。表中有12个用户。这是我的控制器功能

    def listDuplicates(params) {
       def result = User.getAllWithDuplicateIDs()
       def totalDupCount = result.size()

         /*sout for troubleshooting */  
        System.out.println("Duplicate:" + result.ID + " " + result.username)

       params.max = Math.min(params.max ? params.int('max') : 10, 100)
       return [resultList: result, totalDupCount: totalDupCount, params:params ]

}

这是我的观点

        <div>
        <fieldset class="warningFieldSet">
            <h1 style="color: red" align="center">
                <g:message code="Duplicate IDs" />

            </h1>
            <p style="color: red; margin-left: 20px;">Duplicate IDs Found!</p>
                <table>
                    <thead>
                        <tr>

                            <g:sortableColumn property="Username" title="Username" />
                            <g:sortableColumn property="ID" title="ID" />
                            <g:sortableColumn property="Status" title="Status" />
                        </tr>
                    </thead>

                    <tbody>
                        <g:each in="${resultList}" status="i" var="resultDuplicate">
                            <tr class="${(i % 2) == 0 ? 'even' : 'odd'}">
                                <td>
                                    ${resultDuplicate.username}
                                </td>

                                <td style="color: red; font-weight: bold">
                                    ${resultDuplicate.id}
                                </td>

                                <td>
                                    ${resultDuplicate.accountStatus }

                            </tr>
                        </g:each>
                    </tbody>
                    <tfoot>
                        <g:if test="${totalDupCount >10 }">
                            <div class="paginateButtons">
                                <g:paginate action= "listDuplicates" total="${totalDupCount}" />
                            </div>
                        </g:if>
                    </tfoot>
                </table>

            </fieldset>

    </div>

用于查找重复ID的域函数

  static List<User> getAllWithDuplicateIDs() {

    findAll("FROM User WHERE id IN (SELECT id FROM User group by id having count(*) > 1) AND id != ''   ", [])

}

按钮出现。在URL中显示偏移量和最大值。该表只显示所有12个而不是10个在一个页面上而2个在另一个页面上。 2页码显示所以它知道它只是假设每页只显示10个。它本身并没有在表中进行。我假设它有一些传递params等问题。

任何建议/意见/帮助都非常感谢!

3 个答案:

答案 0 :(得分:4)

Grails分页基于两个参数:maxoffsetmax确定页面大小,offset确定当前页面的开始位置。控制器接收这些参数并通常将它们传递给数据库查询。通过grails添加到域对象的list方法处理这些参数,finder方法采用queryParams。通常的模式是将params对象直接传递给list或将queryParams参数传递给查找程序。这将返回从给定偏移量开始的结果集,其中一页长度。

在您的示例中,您在不使用这些参数的情况下调用getAllWithDuplicateIDs。更新您的查询以获取它们,如下所示:

static List<User> getAllWithDuplicateIDs(params) {
    findAll("FROM User WHERE id IN (SELECT id FROM User group by id having count(*) > 1) AND id != ''   ", [], params)
}

或者,使用类似

的内容将其分页到内存中
results = results.drop(params.offset).take(params.max)

最好直接在查询中进行分页,因为它可以更好地处理整个列表不适合内存的情况。

答案 1 :(得分:2)

提供最大偏移功能参数:

def result = User.getAllWithDuplicateIDs([max:params.max, offset:params.offset])

并在查询数据库时使用它们 或者在答案here

中查看答案如何从列表中获取最大值和偏移量的结果

答案 2 :(得分:2)

看看这个例子。

域类..

班级职位{

static belongsTo = [company:Company]
String jobtitle
String jobdescription
String jobskills
String joblocation
String  experience
String jobtype
String salary

}

控制器代码..

    def uijobs () {

        [res:Job.list(params),jobcount:Job.count()]

    }

并且查看就在这里。

         <div class="container" id="main">
        <div class="row">
            <g:each in="${res}">
            <div class="col-sm-4">
                <div class="panel panel-warning">
                    <div class="panel-heading">
                        <h4 class="panel-title"><g:link action="infopagejob" controller="Job" id="${it.id}">${it.jobtitle}</g:link></h4>

                    </div>
                    <div class="panel-body">
                       <table class="table">
                           <tr  class="info" >
                               <td > Job Location</td>
                               <td >${it.joblocation}</td>
                           </tr>
                           <tr  class="info">
                               <td>Description</td>
                               <td>${it.jobdescription}</td>
                           </tr>
                       </table>
                    </div>
                </div>
            </div>
            </g:each>
        </div>
        <g:paginate next="Forward" prev="Back"  maxsteps="10" controller="Job" action="uijobs" total="${jobcount}" params="${params}"/>
</div></div>