我找到了 Burt Beckwith 在这个问题中提供的解决方案:将用户定义属性添加到域类中,并认为在某些情况下这对我们来说可能是一个可行的选择。在对此进行测试时,我有一个具有 Map 属性的域,如引用问题中所述。这是一个简化版本(我有更多非地图属性,但它们与这个问题无关):
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
我想知道是否有办法在 select 语句中从 Map 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 获取一个特定的实例。