鉴于此表:
CREATE TABLE todouser
(
id SERIAL,
email varchar(80) UNIQUE NOT NULL,
password varchar(80),
registered boolean DEFAULT FALSE,
confirmationUri varchar(280),
CONSTRAINT todouser_pkey PRIMARY KEY (id)
);
和班级:
class TodoUser {
Long id;
String email;
String password;
String confirmationUri;
boolean registered;
}
我正在尝试执行以下操作:
TodoUser user = sql.firstRow("""SELECT * FROM todouser WHERE email = $email""")
即。我希望Groovy能够将GroovyRowResult强制处理到我的基本POGO中,而不是像this answer那样自己构建它。
我认为这是合理的,因为GroovyRowResult实现了Map,它只是一个Map键到POGO实例变量名映射...... Groovy对它有一些支持。
问题是,在PostgreSQL表中,'confirmationUri'实际上显示为'confirmationuri'...因此映射失败,因为我的POGO中的'U'是大写的。
我已经尝试在表格和POGO中将'confirmationUri'更改为'确认'并且它有效...但仅仅是为了记录,你如何在Groovy中解决这个问题?
我似乎记得在Groovy类中可以覆盖的方法有助于解析“set / get”调用。但这是正确的方法吗?当调用'get / set'方法时,是否可以使用一些注释来标记'confirmationUri'等同于'confirmationuri'?或者在Groovy中还有其他一些方法可以做到这一点吗?
答案 0 :(得分:0)
我找到了一个解决方案here。以下是对TodoUser的更改(注意:我已将列名更改为'confirmation_uri'):
class TodoUser {
Long id;
String email;
String password;
String confirmationUri;
boolean registered;
def propertyMissing(String name, value) {
if(isConfirmationUri(name)) {
this.confirmationUri = value
} else {
unknownProperty(name)
}
}
def propertyMissing(String name) {
if(isConfirmationUri(name)) {
return confirmationUri
} else {
unknownProperty(name)
}
}
def isConfirmationUri(String name) {
'confirmation_uri'.equals(name)
}
def unknownProperty(String name) {
throw new MissingPropertyException(name, this.class)
}
}
这可以按预期工作(在下面的手动测试中以及实际使用它从GroovyRowResult转换为TodoUser时):
TodoUser user = new TodoUser();
try {
user.invalidProperty = 'http://blah.com'
} catch(MissingPropertyException e) {
e.printStackTrace()
Class type = e.getType()
String prop = e.getProperty()
println """Could not set the $prop property on type $type"""
}
user.confirmation_uri = 'http://blah.com'
println user.confirmationUri
这是一种做法。我没有看到这种方法有什么问题(但也许我错了)。有没有更好的方法/这种方法有什么问题?