2012-08-02 20 views
5

Tengo el dominio "país" y en la lista.gsp tengo el bloque de búsqueda con el campo de entrada. El primer problema fue que cuando traté de usar paginate en mi lista siempre mostraba todos los resultados, en este caso encontré la solución y envié solo 10 valores para mostrar (si conoce otra solución, por favor dígame). Mi búsqueda se ve esto:grails paginación de los resultados de búsqueda

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") 
     } 
    } 

ahora tengo otro problema, cuando pulso página siguiente, mis parametros del campo de búsqueda es la limpieza y el resultado es nulo. Intenté enviar el valor del campo como parámetro, pero creo que hago algo mal.

Mi página de búsqueda se ve así:

<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> 

...... ......

+0

Emmmm, ¿por qué usa el motor de búsqueda y luego utiliza la consulta HQL? –

Respuesta

1

Si usted tiene un gran número de filas en la tabla, paginear así se romperá. Incluso en las tablas de tamaño mediano, será bastante lento, ya que se carga en cada fila de la base de datos.

Una mejor solución es hacer paginación en su consulta. Puede pasar en un mapa de parámetros de consulta para la paginación como el tercer argumento opcional a 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]) 

Además, su forma tiene dos campos con el nombre q. No use un campo oculto con el mismo nombre que una entrada de texto. El valor predeterminado para la entrada de texto se puede especificar con el atributo value.

Y, por último, tendrá que pasar el desplazamiento como un parámetro. Grails tiene una etiqueta que maneja todo esto para usted: g:paginate.

+0

no funciona, me refiero a executeQuery, tengo el error nulo –

+0

¿Funciona sin los parámetros adicionales? – ataylor

2

La mejor solución que he encontrado:

para la acción:

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

para la vista:

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

Ver un completo example.

+0

+1 para recordarme que use 'params =" $ {params} "' Me preguntaba por qué estaba perdiendo mis params entre las páginas –

0

Agregue el objeto params en el atributo params.

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