我有一个给定的postgres db使用枚举类型的值为“M”,“F”。该值可以为null。当我尝试保存一个domainobject时,我收到下面的错误。Grails如何将枚举映射到数据库上的现有枚举
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会正确地转换为字符串表示形式。在试图插入数据时,转换仍然是一个问题。
我有一个肮脏的小的解决方法,其工作原理:
def sql = new Sql(dataSource_log)
def map = [gender:'M']
sql.executeInsert "insert into user_log (gender) values ('${map.gender}')"
我的问题仍然是一样的:如何正确投字符串上插入?也'空'值尚未被接受。 谢谢!
不幸删除数据存储中的枚举是不是一种选择。 – 2013-05-12 22:11:12
尝试添加value()和byValue()方法,可能是将字符串强制转换为枚举的问题。所以尽量按照描述使用。 – 2013-05-12 23:01:58
@DominikH只要删除sqltype“genderlist”。您没有此类型,并且数据库值以字符串形式存储。 – 2013-05-16 15:53:51