2014-03-13 60 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,謝謝。 –