2012-08-02 11 views
5

Ho dominio "paese" e su list.gsp ho blocco di ricerca con campo di input. Il primo problema è stato quando ho provato ad usare paginate sulla mia lista e ho sempre mostrato tutti i risultati, in questo caso ho trovato la soluzione e ho inviato solo 10 valori per la visualizzazione (se conosci un'altra soluzione, per favore dimmelo). La mia ricerca sembra questo:grana paginazione dei risultati di ricerca

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

Ora ho un altro problema, quando si preme pagina successiva poi i miei params dal campo di ricerca è la pulizia e il risultato è nullo. Ho provato a inviare il valore del campo come parametro, ma io cosa faccio qualcosa di sbagliato.

La mia pagina di ricerca si presenta come:

<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, perché si utilizza il motore di ricerca e in seguito si utilizza la query HQL? –

risposta

1

Se si dispone di un gran numero di righe della tabella, impaginando in questo modo si romperà. Anche su tavoli di medie dimensioni, sarà piuttosto lento, poiché viene caricato in ogni riga dal database.

Una soluzione migliore è eseguire l'impaginazione nella query. È possibile passare in una mappa di parametri di query per l'impaginazione come terzo argomento opzionale per 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]) 

Inoltre, il modulo dispone di due campi con nome q. Non utilizzare un campo nascosto con lo stesso nome di un input di testo. Il valore predefinito per l'immissione del testo può essere specificato con l'attributo value.

Infine, è necessario passare l'offset come parametro. Grails ha un tag che gestisce tutto questo per te: g:paginate.

+0

non funziona, voglio dire executeQuery, ho un errore Null –

+0

Funziona senza i parametri aggiuntivi? – ataylor

2

La soluzione migliore che ho trovato:

per l'azione:

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

per la vista:

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

Consulta l'completa example.

+0

+1 per avermi ricordato di usare 'params =" $ {params} "' Mi stavo chiedendo perché stavo perdendo i miei parametri tra le pagine –

0

Aggiungere l'oggetto params nell'attributo params.

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