grails - Grails如何将枚举映射到数据库上的现有枚举

标签 grails enums gorm

我有一个给定的 postgres db,它使用具有以下值“M”,“F”的枚举类型。该值可以为空。当我尝试保存域对象时,出现以下错误。

postgres枚举:

CREATE TYPE genderlist AS ENUM ('M','F')

我的枚举:
public enum GenderCode {

    M,F

    private final String value

    private static list

    public String value() {
        return name()
    }

    public static GenderCode fromValue(String v) {
        return valueOf(v)
    }

}

域类:
class UserLog {

    String gender = null //default null
    ..
}

BootStrap.groovy:
// reading - works fine now
def rows = UserLog.list()

// insert - does not work
UserLog u = new UserLog(gender:null)
u.save()

错误:
| Batch-Entry 0 insert into user_log (active, birthyear, country, gender, user_id, id) values ('1', NULL, NULL, NULL, NULL, 98304) was cancelled.  
| ERROR: column "gender" is of type genderlist but expression is of type character varying
  Note: You will need to rewrite or cast the expression.

编辑
我更新了整个问题以匹配我项目的当前状态。由于我更新了枚举,因此在读取数据时不再遇到问题。 PGObject被正确地转换为String表示形式。尝试插入数据时,转换仍然是一个问题。

我有一个肮脏的小解决方法,它可以工作:
    def sql = new Sql(dataSource_log)
    def map = [gender:'M']

    sql.executeInsert "insert into user_log (gender) values ('${map.gender}')"

我的问题仍然保持不变:如何在插入时将字符串正确转换为还不接受'null'值。
谢谢!

最佳答案

在grails中,您的自定义枚举存储为String。看看日志

('1', NULL, NULL, 'M', NULL, 98304)

它想插入一个字符串。看起来项目中的类与数据库之间存在冲突。尝试从数据库中删除性别列表类型。
根据我的经验,我这样定义:
public enum ActivityState {
    ACTIVE("active"),
    NOT_ACTIVE("not_active")

    private final String value

    public ActivityState(String value) {
        this.value = value
    }

    String toString(){
        value
    }

    public String value() {
        value
    }

    public static ActivityState byValue(String value){
        values().find { it.value == value }
    }
}

像这样使用:
ActivityState activityState

关于grails - Grails如何将枚举映射到数据库上的现有枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16497675/

相关文章:

c++ - 非固定类型枚举范围定义的动机

grails - Grails GORM按对象属性的属性查找

grails - 获取带有gsp中唯一项目的下拉列表,grails

grails - Grails的classpath

macos - 使用TextMate打开Grails项目

java - 在泛型类中使用枚举(作为类型)并循环遍历其元素

grails - 在 Grails 中指定插件的顺序

c# - WebAPI 中的枚举返回字符串值

grails - 从文件引导Grails

grails - Grails命名查询以基于多行中的最大值选择行