2

我有一个不错的小域类,它由三个整数组成,但没有主键(因为糟糕的数据库设计......重写是不可能的):

class Domain implements Serializable {

   Integer foo
   Integer bar
   Integer flag

    static mapping = {
        table 'domain'
        version false

        id  composite: ['foo', 'bar']
        foo column: 'foo_nbr'
        flag    column: 'value_I_want_flag'
        bar column: 'bar_nbr'   
    }
}

我希望能够使用 foo 和 bar 的复合 id 通过 read 函数访问标志

Integer yayFlag = Domain.read(foo, bar).flag

对此有最佳实践吗?

4

2 回答 2

3

根据有关 this 的文档,您应该能够通过get()带有原型对象的语法进行引用:

def d = Domain.get(new Domain(foo: 23, bar: 999))

请注意,它还建议实现hashCode()and equals()(使用 id 组件字段),并创建 class Serializable

如果read()是要求,您可以尝试相同的方法,但我还没有搜索源以知道这是否有效(参考文档实际上并没有明确显示您可以执行上述操作,所以在参考get()中不要这么说read()文档不是决定性的)。我已经离开 Grails 一段时间了,但您也可以尝试discard()避免get()在刷新时写入数据库。

于 2012-12-06T17:39:56.007 回答
2

你不能这样做,你需要像 Brian 提到的那样创建一个原型实例。您可以使用您想要使用的语法创建一个帮助器方法来为您工作:

static Domain read(int foo, int bar) {
   read new Domain(foo: foo, bar: bar)
}

您可能也需要类似的get方法。

于 2012-12-06T18:09:36.167 回答