GroovyRowResult强制进入域对象

GroovyRowResult强制进入域对象,groovy,Groovy,鉴于此表: 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

鉴于此表:

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""")
i、 e.我希望Groovy处理GroovyRowResult到我的基本POGO中的强制操作,而不是像中那样自己构建它

我认为这是合理的,因为GroovyRowResult实现了映射,它只是POGO实例变量名映射的映射键。。。Groovy支持的东西

问题是,在PostgreSQL表中,“confirmationUri”实际上显示为“confirmationUri”。。。所以映射失败了,因为在我的POGO中“U”是大写的

我试着将表和POGO中的“confirmationUri”更改为“confirmation”,它可以工作。。。但是为了记录在案,在Groovy中您将如何解决这个问题

我似乎记得Groovy类中有一些方法可以重写,它们有助于解决“set/get”调用。但这是正确的方法吗?当调用“get/set”方法时,是否有一些注释可以用来将“confirmationUri”标记为等同于“confirmationUri”?或者在Groovy中还有其他方法可以做到这一点?

我找到了一个解决方案。以下是对TodoUser的更改(注意:此后我将列名更改为“confirmation_uri”):

这正如预期的那样工作(在下面的手动测试中,以及实际使用它从GroovyRowResult转换为TodoUser时):


这是一种方法。我不认为这种方法有什么错(但也许我错了)。有更好的方法吗/这种方法有什么问题吗?

我认为你的编辑应该是这个问题的答案。让其他人回答,最高票数可以说是最好的办法。Thx Michael,我接受了你的建议。
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)
    }
}
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