你好我回来了另一个乏味的问题!
尝试让我的表分页。表中有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等问题。
任何建议/意见/帮助都非常感谢!
答案 0 :(得分:4)
Grails分页基于两个参数:max
和offset
。 max
确定页面大小,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>