【问题标题】:Grails Domain Class without ID field or with partially NULL composite field没有 ID 字段或部分为 NULL 复合字段的 Grails 域类
【发布时间】:2009-01-09 22:36:38
【问题描述】:

根据对上一个问题的回答(在此处回答:SQL/Database Views in Grails),我尝试使用域类来表示数据库中的视图。然而,这在大多数情况下都非常有效:

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

答:
id,varX
1,“废话”
2,"Foo"
3,"酒吧"

乙:
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,"废话",NULL,NULL,NULL
2,"Foo",1,1,"Boom"
2,"Foo",2,2,"Fizzle"
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,它仍然可以唯一标识一行?

我知道我们可以直接使用 Groovy SQL 来直接查询视图而无需关联的域类(我们现在实际上正在这样做),但理想情况下我们希望使用域类来表示视图。此外,抛开所有争论不谈,这两个问题可以更通用地应用,而不仅仅是我们的特定问题。

【问题讨论】:

    标签: grails null dns composite


    【解决方案1】:

    我们之前也遇到过这个问题。

    根据我的经验,复合 ID 在 Grails 或 Hibernate 中没有得到很好的支持。

    我们总能找到一种方法为所有域类设置唯一 ID。

    对于真实的表,我们只需添加一个自增字段,即使我们不使用 grails 我们也会使用复合键。

    对于数据库视图,我们通常在其中一个连接表中已经有一个 ID,该 ID 在该上下文中最终是唯一的,但如果我们不这样做,有办法破解/模拟它。例如,在 SQL 中,只需将您将在复合键中使用的键连接为单个字段并将其用作键。

    【讨论】:

      【解决方案2】:

      您是否尝试过 reference 页面上“复合 ID”部分提到的内容?我自己没有尝试过使用它,我不确定这在最新版本中是否有所改变。

      另外,如果您查看表 B,A.id 的唯一值是 2 和 3,所以您不认为当 A.id 为 1 时,B.id、C.id 和 varY 的结果将为空?还是仅作为示例?

      【讨论】:

      • B.id、C.id 和 varY 的结果 /is/null... 请参阅以下行: 1,"Blah",NULL,NULL,NULL 该视图使用两个左侧-加入。另外,是的,我尝试了所有这些,问题是复合字段的任何组件都不能为空,对于上述视图的任何合理的复合字段都是如此。
      猜你喜欢
      • 1970-01-01
      • 2017-10-09
      • 1970-01-01
      • 2010-10-13
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      相关资源
      最近更新 更多