2012-08-02 19 views
5

"country" etki alanım var ve list.gsp üzerinde giriş alanı olan bir arama bloğum var. İlk sorun, listemde paginate kullanmayı denediğimde her zaman tüm sonuçları gösterdim, bu durumda çözümü aldım ve ekran için sadece 10 değer yolladım (eğer başka bir çözüm biliyorsanız lütfen bana söyleyin). Arama bu görünür: i arama alanı temizlik ve sonuç null dan sonra benim params sonraki sayfayı bastığınızda arama sonuçlarının sayfalarına ayrışması

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

Şimdi ben, başka bir sorun var. Alan değerini parametre olarak göndermeye çalıştım ama yanlış bir şey yapıyorum.

<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, neden arama motorunu kullanıyorsunuz ve daha sonra HQL sorgusu kullanıyorsunuz? –

cevap

1

Eğer tablodaki satırların çok sayıda varsa,:

My arama sayfası benziyor Böyle paginating kırılacak. Orta ölçekli tablolarda bile, veritabanı her satırda yüklendiği için oldukça yavaş olacaktır.

Daha iyi bir çözüm, sorgunuzda sayfalandırma yapmaktır. Sen executeQuery için isteğe bağlı üçüncü argüman olarak sayfalandırmada sorgu parametrelerinin bir haritada geçirebilirsiniz:

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

Ayrıca, form adı q ile iki alanı vardır. Metin girişi ile aynı ada sahip gizli bir alan kullanmayın. Metin girişi için varsayılan değer value özniteliği ile belirtilebilir. Son olarak, bir paramater olarak ofseti geçmek zorunda kalacaksınız. Grails'in sizin için tüm bunları işleyen bir etiketi vardır: g:paginate.

+0

çalışmıyor, executeQuery demek, hatam var Null –

+0

Ek parametreler olmadan çalışıyor mu? – ataylor

2

buldum iyi çözüm: eylem için

: görünüm için

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

tam example bakınız.

+0

+1 params = "$ {params}" 'ı kullanmamı hatırlattığınız için +1 sayfalar arasında neden paramlarımı kaybettiğimi merak ediyordum –

0

Params nesnesini params özniteliğine ekleyin.

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