1

鉴于此表:

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,而不是像在这个答案中那样自己构建它。

我认为这是合理的,因为 GroovyRowResult 实现了 Map 并且它只是 POGO 实例变量名称映射的 Map 键...... Groovy 有某种支持。

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

我已经尝试在表格和 POGO 中将 'confirmationUri' 更改为 'confirmation' 并且它可以工作......但只是为了记录,你将如何在 Groovy 中解决这个问题?

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

4

1 回答 1

0

我在这里找到了一种解决方案。以下是对 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

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

于 2013-10-20T11:36:09.537 回答