我有一个给定的 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/