2014-03-13 89 views
1

我无法理解如何代表的一些信息我处理的Grails应用程序使用Hibernate存储的地图。但它确实是更多的SQL问题。在休眠/格姆

我有一些项目在数据库中存储,一个JSON文件。每个项目都有一个合法性值的地图。一个合法的地图看起来是这样的:

{ 
    "form2003": "legal", 
    "form2007": "legal", 
    "form2008": "banned", 
    "form2009": "restricted" 
    "form2013": "legal" 
} 

或本

{ 
    "form2003": "legal", 
    "form2004": "legal", 
    "form2005": "legal", 
    "form2007": "restricted", 
    "form2008": "banned", 
    "form2009": "banned" 
} 

键的范围从“form2001”到“form2013”​​,而值可以被“禁止”“限制”或“法律”。缺乏明确的地位暗示了第四种地位。

现在,我代表自己的表/域类型的项目,与并行法律制度的表;项目与合法性有一对一的关系。我有几个类似于合法性的其他表/域类,每个都与Item有自己的一对一关系。

我现在的合法性域类基本上看起来像这样

class Legalities { 
    static belongsTo = [item: Item] 

    String form2000 
    String form2001 
    ... 
    String form2013 

    static constraints = { 
     form2000(nullable: true) 
     ... 
     form2013(nullable: true) 
    } 
} 

我需要能够有效地找到每一个项目,其中某一领域,像form2010,有一个给定值。这似乎应该是简单的,用HQL这样的查询:

"from Item as i where i.legalities.form2010 = \'legal\'" 

的事情是,Grails和Hibernate不会让我参数化查询的字段名,只在字段值!字段名称来自表单,所以我最终不得不尝试自己清理字段名称并手动组装查询字符串。有没有其他方法可以让我在这里构建信息?或者我遇到了Hibernate的缺陷?

回答

1

尝试使用标准来创建你的查询,像这样:

def getLegalitiesForForm(formNum, formVal) { 
    String formField = "form20${formNum}" 

    return Legalities.createCriteria().get { 
     eq formField, formVal 
    } 
} 

http://grails.org/doc/2.3.4/guide/GORM.html#criteria

+0

这是一个更容易一些比我当前的代码来了解。不知道标准API,谢谢。 –