grails - GORM : setting an ordering on enum values

标签 grails enums grails-orm

鉴于以下

class MyDomain {
   enum State {
     PRIMORDIAL,
     INITIAL,
     EXTENDED,
     TERMINAL
   }
   State state
}

我希望保留“状态”属性,以便:
  • 可读值存储在 DB 中(I.E 不是序数,而是字符串)
  • 值的顺序不同于隐含的字典顺序(因此 SQL 的 ORDER BY 将以所需的方式对它们进行排序)

  • 如何做到这一点?

    谢谢

    最佳答案

    很确定答案是......不是很容易。枚举当前仅在数据库中存储 1 个值,因此如果您想要数据库中的字符串,那么这是唯一需要针对其发出 ORDER BY 的数据。也就是说...一旦将数据加载到 Gorm 域对象中,您就可以对其进行排序,但这不会使您的分页正确(如果您需要的话)。

    您可以创建自己的类似枚举的类来包含订单和字符串,并将其映射到表中的两个字段,然后根据需要按一个或另一个排序。我经常用我所说的“可能值”或“菜单值”来做这件事;就像是:

    class MenuValue {
       String text
       String description // used for mouseover, or some such
       int sort_order
       String group  // used to retrieve all values for a menu/pulldown, etc.
    }
    

    然后,我通常将代码放入我的 Fixtures 中,以便在测试等需要时创建菜单选项。

    与枚举相比,它的好处是能够使用管理员类型的 crud 屏幕动态更改菜单/选择的内容。您仍然可以通过以下方式“迭代”它们,就像枚举一样:
    MenuValue.findAllByGroup( "groupname" ).sort { it.sort_order }.each { it -> iteration code }
    

    所以,如果你有一个类,有人必须从菜单中选择,你可以这样做:
    class SomeObject {
        String something
        MenuValue selectedValue
    }
    

    您可以检索所有 SomeObjects,按 MenuValue 的 sort_value 排序,例如:
    params.sort = "selectedValue.sort_order"
    params.order = "asc"
    SomeObject.findAllBySomethingLike( search_term, params )
    

    在编辑 SomeObject 期间,您可以选择带有可能值列表的选择,并将该选择的名称设置为“selectedValue.id”,Grails 将在数据绑定(bind)期间自动填充 SomeObject 中的 selectedValue 字段,并引用选定的菜单值。

    希望这会有所帮助

    关于grails - GORM : setting an ordering on enum values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26076696/

    相关文章:

    grails - Grails插件配置被应用覆盖

    hibernate - 无法以一对一关系更新拥有方的属性

    java - EnumMap 的奇怪语法

    grails - 如何从字符串获取grails类名

    Java:枚举的通用方法

    swift - 无法从框架内访问公共(public)枚举

    Grails 自动关系抓取

    java - 映射遗留模型 - 仅具有唯一约束的表可以用作域类?

    grails - 如何根据某些关联获取对象?

    url - Grails/Groovy:URL参数(最大值,偏移量)空白/字符串时引发NumberFormatException