2012-08-02 13 views
5

Tôi có tên miền "country" và trên list.gsp tôi có khối tìm kiếm với trường nhập. Vấn đề đầu tiên là khi tôi cố gắng sử dụng paginate trên danh sách của tôi luôn luôn cho thấy tất cả kết quả, trong trường hợp này tôi fount các giải pháp và tôi đã gửi chỉ 10 giá trị để hiển thị (nếu bạn biết một giải pháp xin vui lòng cho tôi biết). Tìm kiếm của tôi trông như sau:grails pagination của các kết quả tìm kiếm

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

Bây giờ tôi có một vấn đề khác, khi tôi nhấn trang tiếp theo thì tham số của tôi từ trường tìm kiếm sẽ được làm sạch và kết quả là không. Tôi đã cố gắng gửi giá trị trường như thông số nhưng tôi làm điều gì đó sai.

trang tìm kiếm của tôi trông giống như:

<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, tại sao bạn sử dụng công cụ tìm kiếm và sau đó sử dụng truy vấn HQL? –

Trả lời

1

Nếu bạn có một số lượng rất lớn của các hàng trong bảng của bạn, phân trang như thế này sẽ phá vỡ. Ngay cả trên các bảng có kích thước trung bình, nó sẽ khá chậm, vì nó tải trong mỗi hàng từ cơ sở dữ liệu.

Giải pháp tốt hơn là thực hiện phân trang trong truy vấn của bạn. Bạn có thể vượt qua trong một bản đồ của các tham số truy vấn cho pagination như là đối số thứ ba tùy chọn để 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]) 

Ngoài ra, hình thức của bạn có hai lĩnh vực với tên q. Không sử dụng trường ẩn có cùng tên với kiểu nhập văn bản. Giá trị mặc định cho đầu vào văn bản có thể được chỉ định với thuộc tính value.

Và cuối cùng, bạn sẽ phải vượt qua trong bù trừ làm đại lý. Grails có một thẻ xử lý tất cả những điều này cho bạn: g:paginate.

+0

nó không hoạt động, tôi có nghĩa là executeQuery, tôi có lỗi Null –

+0

Liệu nó có hoạt động mà không có các tham số bổ sung? – ataylor

2

Giải pháp tốt nhất mà tôi tìm thấy:

cho hành động:

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

cho quan điểm:

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

Xem hoàn chỉnh example.

+0

+1 để nhắc tôi sử dụng 'params =" $ {params} "' Tôi đã tự hỏi tại sao tôi lại mất thông số giữa các trang –

0

Thêm đối tượng params vào thuộc tính params.

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