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