【问题标题】:Storing maps in Hibernate/GORM在 Hibernate/GORM 中存储地图
【发布时间】:2014-04-18 21:33:30
【问题描述】:

我无法理解如何表示我在 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”​​,而值可以是“禁止”、“受限”或“合法”。第四种状态是通过缺乏明确的状态来暗示的。

现在我用一个平行的合法性表来表示它们自己的表/域类型中的项目;项目与合法性具有一对一的关系。我还有其他几个类似于 Legalities 的表/域类,每个类都有自己与 Item 的一对一关系。

我现在拥有的 Legalities 域类基本上是这样的

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 的不足?

【问题讨论】:

    标签: sql hibernate grails


    【解决方案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

    【讨论】:

    • 这比我当前的代码更容易理解。不知道条件 API,谢谢。
    猜你喜欢
    • 2022-08-21
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多