引發了我試著做個測試的念頭: 可否直接使用輸入欄位進行 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 的了解會有多一點的認識。
沒有留言:
張貼留言