2012-08-02 16 views
5

Mam domenę "kraj" i na liście listy przeszukuję blok wyszukiwania z polem wprowadzania. Pierwszy problem polegał na tym, że gdy próbowałem użyć paginate na mojej liście zawsze pokazywałem wszystkie wyniki, w tym przypadku używam rozwiązania i wysłałem tylko 10 wartości do wyświetlenia (jeśli znasz inne rozwiązanie, proszę powiedz mi). Moje poszukiwania wygląda następująco:paginacja paginacji wyników wyszukiwania

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

Teraz mam inny problem, po naciśnięciu na następnej stronie następnie moje params z pola wyszukiwania jest sprzątanie, a wynik jest zerowy. Próbowałem wysłać wartość pola jako parametr, ale coś robię źle.

Moja strona wyszukiwania wygląda następująco:

<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, dlaczego korzystasz z wyszukiwarki, a później używasz zapytania HQL? –

Odpowiedz

1

Jeśli masz bardzo dużą liczbę wierszy w tabeli, taka strona zostanie przerwana. Nawet na średnich tabelach będzie dość powolny, ponieważ ładuje się w każdym wierszu z bazy danych.

Lepszym rozwiązaniem jest tworzenie stronicowania w zapytaniu. można przekazać na mapie parametrów zapytań dla paginacji jako opcjonalny trzeci argument 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]) 

Również swoją postać ma dwa pola z nazwą q. Nie używaj ukrytego pola o tej samej nazwie, co wpis tekstowy. Domyślna wartość wprowadzania tekstu może być określona za pomocą atrybutu value.

Na koniec musisz przesłać offset jako parametr. Grails ma tag, który obsługuje to wszystko: g:paginate.

+0

to nie działa, mam na myśli executeQuery, mam błąd Null –

+0

Czy działa bez dodatkowych parametrów? – ataylor

2

Najlepszym rozwiązaniem znalazłem:

do działania:

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

dla widoku:

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

Zobacz pełną example.

+0

+1 za przypomnienie o używaniu 'params =" $ {params} "' Zastanawiam się, dlaczego tracę params między stronami –

0

Dodaj obiekt params w atrybucie params.

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