2014-01-15 98 views
1

我有一個Web應用程序,用於調用其數據庫調用的Grails應用程序。數據庫充滿了通過groovy調用返回的產品。一個例子對象,我會從數據庫獲取如下:如何從Web應用程序過濾Groovy/Grails關閉

class Product{ 
    Boolean is_blue; 
    Boolean is_round; 
    Boolean is_alive; 
    Boolean is_active; 
    String type; 
    String name; 
} 

我想對Grails的應用程序調用這些布爾值進行過濾,但我不知道如何通過一個封閉做到這一點,這是我的封閉目前看起來像。

def productXML = 
    Product.findAll("from Product as p where p.is_active = 1 and p.type = :type 
         ORDER BY p.${params.sort} ${params.order}", 
         [type: type], [max: params.max, offset: params.offset]) 

我最困惑的是我如何將這些參數傳遞給閉包。任何幫助將不勝感激。謝謝。

回答

0

我最終創建了一個查詢生成器,如果在查詢字符串中有is_blue = 1,我會將其添加到查詢中。

if(params.is_blue){ 
     query +=" and p.is_blue = ${params.is_blue}" 
    } 
1

喜歡的東西

def productXML = 
    Product.findAll("from Product as p where p.is_active is :active \ 
         and p.type = :type \ 
         ORDER BY p.${params.sort} ${params.order}", 
         [type: type, active: true], 
         [max: params.max, offset: params.offset]) 

OR

def productXML = Product.findAll(params){ 
    type == type && is_active == active 
} 

是你在找什麼?詳情請參閱findAll

+0

我正在嘗試第二種方法,無論使用什麼參數,我都找回所有結果。 – ninjasense

+0

第一種方法是抱怨所提供的參數。我不知道我會從客戶端收到什麼參數。例如,有時客戶端將提供is_active,但不提供類型。 – ninjasense

0
  1. 始終使用替換變量
  2. 爲了使參數可選的,用這一招(使用類型作爲示例):

DEF productXML = Product.findAll(「從產品爲p,其中p。 is_active是:活動 和(p.type =:type或:type == null) ORDER BY p.:sort:order「, [type:type,active:true,sort:params.sort,order :params.order],[max:params.max,offset:params.offset])