5

我有域“国家”并且在 list.gsp 上我有带有输入字段的搜索块。第一个问题是当我尝试在我的列表中使用分页时,总是显示所有结果,在这种情况下,我找到了解决方案,我只发送了 10 个值进行显示(如果你知道另一种解决方案,请告诉我)。我的搜索看起来是这样的:

    def search = {
       if(query){
           def srchResults = searchableService.search(query, params)

           def result =  Country.executeQuery("select  new map(a.name as name, a.datacenter as datacenter) from Country a where a.name like '%"+ params.q + "%'")

           if (params.offset)
           {
               x = params.offset.toInteger()
               y = Math.min(params.offset.toInteger()+9, result.size()-1)
           } else
            {
            x = 0
            size = result.size() - 1
            y = Math.min(size, 9)
             }     
           def q=params.q

          [countryInstanceList: result.getAt(x .. y), countryInstanceTotal:result.size(), q:params.q]

       }else{
           redirect(action: "list")
       }
   }

现在我有另一个问题,当我按下下一页时,我的搜索字段中的参数正在清理,结果为空。我试图将字段值作为参数发送,但我做错了什么。

我的搜索页面如下所示:

<g:form action="search">
            <div class="search" >
                Search Country
                <g:hiddenField name="q" value="${params.q}" />
                <input type="text" name="q" value="${params.q}" />
                <input type="submit" value="Search"/>
            </div>
        </g:form>

…………

4

3 回答 3

2

我找到的最佳解决方案:

行动:

def list() {
... //use params to filter you query and drop results to resultList of type PagedResultList
return [resultList: resultList, resultTotal: resultList.getTotalCount(), filterParams: params]
}

对于视图:

<g:paginate total="${resultTotal}" action="list" params="${filterParams}"/>

看一个完整的例子

于 2015-02-03T00:02:43.903 回答
1

如果您的表中有大量行,那么这样的分页将会中断。即使在中等大小的表上,它也会很慢,因为它会从数据库中加载每一行。

更好的解决方案是在查询中进行分页。您可以将分页的查询参数映射作为可选的第三个参数传递给executeQuery

def maxResults = 10
def result = Country.executeQuery(
    "select  new map(a.name as name, a.datacenter as datacenter) from Country a where a.name like ?", 
    [params.q], 
    [max: maxResults, offset: params.offset])

此外,您的表单有两个带有 name 的字段q。不要使用与文本输入同名的隐藏字段。可以使用value属性指定文本输入的默认值。

最后,您必须将偏移量作为参数传递。Grails 有一个标签可以为您处理所有这些:g:paginate.

于 2012-08-02T14:41:39.670 回答
0

在 params 属性中添加 params 对象。

<g:paginate total="${resultTotal}" action="list" params="${params}"/>
于 2015-07-08T20:58:03.810 回答