2010年2月10日

Grails 中的 MOP 試驗

在臺灣Grails開發者論壇的技術分享討論區中, 提到使用一組特定欄位名稱做為查詢條件(查詢條件+分頁+排序)
引發了我試著做個測試的念頭: 可否直接使用輸入欄位進行 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 的了解會有多一點的認識。

沒有留言: