GroovyRowResult强制进入域对象

时间:2013-10-19 14:03:52

标签: 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 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中还有其他一些方法可以做到这一点吗?

1 个答案:

答案 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

这是一种做法。我没有看到这种方法有什么问题(但也许我错了)。有没有更好的方法/这种方法有什么问题?