根据上一个问题的答案(这里回答:SQL/Database Views in Grails),我尝试使用域类来表示我的数据库中的视图。然而,在大多数情况下,这非常有用:
我有一个没有单一唯一键的视图。假设基础表看起来像这样:
A:
ID,VARx前提
1, “嗒嗒”
2, “富”
3, “酒吧”
B:
ID,A.id,C.id
1,2,1
2,2,2
3,3,1
C:
ID,因人而异
1, “轰”
2, “菲兹尔”
我的观点如下:
A.id,VARx前提,B.id,C.id,因人而异
1, “等等”,NULL,NULL,NULL
2, “富”,1,1, “轰”
2, “富”,2,2 “菲兹尔”
3, “酒吧”,3,1, “轰”
这正是它应该如何寻找我们的目的。但是,正如您所看到的,我们可以为视图构造的最佳唯一复合ID是['A.id','C.id'],因为它唯一标识每个元素,但Grails失败,因为它似乎无法处理复合ID的一部分为NULL(实际上,list()返回4个对象的列表,第一个是空指针,其余是视图的实际域实例。)
请注意,我们也可以使用A.id和B.id,但它也会遇到同样的问题。
另请注意,我们希望至少一次显示表A中的元素(对于表B / C中未找到的任何字段使用空值),如果表B中有多个相应的条目,则可能多次。
所以,我的问题是两部分:
1:是否可以定义一个没有任何ID字段的grails域类?我们不需要任何视图条目的永久句柄,我们只需要在该视图中列出数据
2:如果没有,是否可以使用复合ID字段定义grails域类,其中一部分可能为NULL,但即使复合ID的一部分为NULL,它仍会唯一地标识一行? < / p>
我知道我们可以使用直接的Groovy SQL直接查询视图而没有关联的域类(我们现在实际上是这样做的),但理想情况下我们想用域类来表示视图。此外,除了所有论点之外,这两个问题可以更广泛地应用,而不仅仅是我们的特定问题。
答案 0 :(得分:3)
之前我们遇到过这个问题。
根据我的经验,Grails或者Hibernate中的复合ID都不受支持。
我们总能找到一种为所有域类提供唯一ID的方法。
对于真实表格,我们只添加一个自动增量字段,即使我们没有使用grails也可以使用复合键。
对于数据库视图,我们通常在其中一个连接表中已经有一个ID,最终在该上下文中是唯一的,但如果我们不这样做,则有方法可以对其进行破解/模拟。例如,在SQL中,只需将您在复合键中使用的键连接为单个字段,并将其用作键。
答案 1 :(得分:1)
您是否尝试过此reference页面上的Composite Ids部分提及的内容?我自己没有尝试过使用它,我不确定最新版本是否有所改变。
另外,如果你看一下表B,A.id的唯一值是2和3,所以你不认为当A.id为1时,B.id,C.id和varY的结果为null ?或者仅仅是作为一个例子?