【问题标题】:Querying values from a Map Property in a Grails Domain Class从 Grails 域类中的映射属性中查询值
【发布时间】:2012-05-14 16:36:19
【问题描述】:

我找到了 Burt Beckwith 在这个问题中提供的解决方案:add user define properties to a domain class,并认为这在某些情况下对我们来说可能是一个可行的选择。在对此进行测试时,我有一个具有 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 获取一个特定的实例。

【问题讨论】:

    标签: grails grails-domain-class


    【解决方案1】:

    如何使用Criteria,但是我没有任何sql server所以我还没有测试。

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

    【讨论】:

    • 你也可以使用eq('Test1','abc')
    • 谢谢。我可以使用 where 语句进行过滤,但很高兴知道标准也有效。不过,我真正的问题是如何从地图中获取单个值作为选择中的单个值。我们在一些查询中动态组合列,然后通过 hql 运行它们,所以我正在寻找等效的:SELECT elements(space.dynForm['Test1']) . . . ,它不起作用。
    猜你喜欢
    • 2011-09-14
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多