对于上一个问题的答案(此处的答案:SQL/Database Views in Grails),我尝试使用域类表示数据库中的 View 。但是,这在大多数情况下效果很好。

我有一个 View ,没有一个唯一的键。假设基础表如下所示:

A:
id,varX
1,“布拉”
2,“Foo”
3,“酒吧”

B:
id,A.id,C.id
1,2,1
2,2,2
3,3,1

C:
id,varY
1,“景气”
2,“嘶嘶声”

我的看法如下:
A.id,varX,B.id,C.id,varY
1,“Blah”,NULL,NULL,NULL
2,“Foo”,1,1,“Boom”
2,“Foo”,2,2,“Fizzle”
3,“Bar”,3,1,“Boom”

这正是我们应该寻求的目标。但是,正如您所看到的,我们可以为 View 构造的最佳唯一复合id是['A.id','C.id'],因为它唯一地标识了每个元素,但是Grails失败了,因为它似乎无法处理复合ID的一部分为NULL(实际上,list()返回4个对象的列表,第一个是空指针,其余的是 View 的实际域实例)。

请注意,我们也可以使用A.id和B.id,但是它也会遇到相同的问题。

还要注意,我们希望至少显示一次来自表A的元素(对于表B / C中未找到的任何字段,其值为空),如果表B中有多个对应的条目,则可能会显示很多次。

所以,我的问题是2个部分:
1:是否可以定义完全没有任何ID字段的grails域类?我们不需要任何 View 条目的永久句柄,我们只需要列出该 View 中的数据即可。
2:如果不是,是否可以使用复合ID字段定义grails域类,该复合ID字段的一部分可能为NULL,但是即使复合ID的一部分为NULL,它也将唯一地标识行?


我知道我们可以使用直接的Groovy SQL来直接查询 View 而无需关联的域类(实际上,我们现在正在这样做),但是理想情况下,我们希望使用域类来表示 View 。此外,除所有论点外,这两个问题的适用范围远不只是我们的特定问题。

最佳答案

我们以前有这个问题。

以我的经验,Grails或Hibernate都没有很好地支持Composite ID。

我们总是找到一种为所有域类拥有唯一ID的方法。

对于实际表,即使不使用grails,我们也只会使用一个Composite键来添加一个自动增量字段。

对于数据库 View ,通常在其中一个联接表中已经有一个ID,该ID最终在该上下文中是唯一的,但如果不是这样,则有一些方法可以对其进行破解/模拟。例如,在SQL中,只需将要在复合键中使用的键作为单个字段进行连接,然后将其用作键。

09-25 17:34
查看更多