引發了我試著做個測試的念頭: 可否直接使用輸入欄位進行 GORM 物件的 criteria 處理 ?
測試的程式片斷:
static YOURS_PROPERTIES = Yours.metaClass.properties //使用 criteria builder Yours.withCriteria { //取 cri_ 開頭的輸入欄位 params*.key.grep(~/^cri_.*/).each{ p -> //取相對應於 GORM 物件的欄位名稱 def field = ((String)p).split('_')[1] //取出輸入欄位的內容 def value = params.getAt(p) //含有數值? (此為假設; 不過, 並非所有 model 都是如此設計) def isLong = value==~ /^[1-9][0-9]*/ YOURS_PROPERTIES.each{ col-> if (col.name == field) { //若 type 為物件 if (col.type.name == 'java.lang.Object') { "$col.name" { eq('id', isLong ? Long.parseLong(value) : value) } } else { eq(col.name, col.type.getDeclaredConstructor(String.class).newInstance(value)) } } } } }使用上述的方式, 僅限於簡單的資料查詢; 因為一般查詢作業不會如此簡化。
不過, 這樣子的試驗對於 MOP 的了解會有多一點的認識。
沒有留言:
張貼留言