2012-05-14 70 views
0

我發現Burt Beckwith在這個問題中提供的解決方案:add user define properties to a domain class,並認爲在某些情況下這可能是我們可行的選擇。在測試中,我有一個帶有Map屬性的域,如引用問題中所述。下面是一個簡化版本(我有更多的非映射屬性,但它們是不相關的這個問題):從Grails域類中的地圖屬性查詢值

class Space { 
    String spaceDescription 
    String spaceType 
    Map dynForm 

    String toString() { 
    return (!spaceType)?id:spaceType + " (" + spaceDescription + ")" 
} 
} 

我有保存在dynForm地圖像「Test1的」一些任意的數據空間中的一些實例:'abc'和'Test2':'xyz'。

我試圖查詢這個數據並已成功地用於HQL過濾執行以下操作:

String className = "Space" 
Class clazz = grailsApplication.domainClasses.find { it.clazz.simpleName == className }.clazz 

def res = clazz.executeQuery("select distinct space.id, space.spaceDescription from Space as space where space.dynForm['Test1'] = 'abc' ") 
log.debug "" + res 

我想知道是否有一種方法在選擇選擇從地圖dynForm單個項目聲明。服用點是這樣的:

def res = clazz.executeQuery("select distinct space.id, elements(space.dynForm['Test1']) from Space as space where space.dynForm['Test1'] = 'abc' ") 

我可以選擇整個地圖是這樣的:

def res = clazz.executeQuery("select distinct elements(space.dynForm) from Space as space where space.dynForm['Test1'] = 'abc' ") 

但我只想基於字符串IDX得到一個特定的實例。

回答

0

如何使用Criteria,但我沒有任何SQL Server,所以我還沒有測試過。

def results = Space.createCriteria().list { 
    dynForm{ 
     like('Test1', 'abc') 
    } 
} 
+0

你可以用'eq('Test1','abc')' – XenoN

+0

謝謝。我可以用where語句過濾,但也很好地瞭解標準工作。不過,我真正的問題是,如何從地圖中獲取單個值作爲選擇中的單個值。我們在一些查詢中動態組裝列,然後通過hql運行它們,所以我正在尋找相當於:'SELECT elements(space.dynForm ['Test1'])。 。 。 '這不起作用。 –