没有 ID 字段或具有部分 NULL 复合字段的 Grails 域类

2024-02-28

根据对上一个问题的回答(此处回答:Grails 中的 SQL/数据库视图 https://stackoverflow.com/questions/425294/sql-database-views-in-grails#427691),我尝试使用域类来表示数据库中的视图。然而,这在大多数情况下都非常有效:

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

A:
id,varX
1、“呸”
2,"Foo"
3,"Bar"

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,“废话”,NULL,NULL,NULL
2,"Foo",1,1,"繁荣"
2,"Foo",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,它仍将唯一标识一行?

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


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

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

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

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

对于数据库视图,我们通常在其中一个连接表中已有一个 ID,该 ID 最终在该上下文中是唯一的,但如果没有,可以通过一些方法来破解/模拟它。例如,在 SQL 中,只需将要在复合键中使用的键作为单个字段连接起来,并将其用作键。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

没有 ID 字段或具有部分 NULL 复合字段的 Grails 域类 的相关文章

  • 如何在grails中自定义spring security插件登录页面

    我尝试在 Spring Security Core 3 1 1 中自定义登录页面 但没有成功 我在views目录中创建了一个登录目录 并在登录目录中创建了一个auth gsp 并将我的自定义表单放在那里 这是代码
  • 带汇总总计和小计

    我有一个脚本可以生成几乎已经存在的结果集 我正在尝试获取小计和总计 我在年份栏中得到了小计 在最后得到了总计 我的目标是让最终结果显示 总计 而不是小计 请注意 由于汇总函数 我的最后一行 位置 也返回为空 SELECT YEAR COUN
  • 获取 grails 中单击的提交按钮的名称

    在表单上我有两个提交按钮
  • C 中的 NULL 是否需要/定义为零?

    在我的 GCC 测试程序中 NULL 似乎为零 但维基百科说NULL只需要指向不可寻址的内存 有编译器做吗NULL非零 我很好奇是否if ptr NULL 是比更好的练习if ptr NULL is guaranteed to be zer
  • Java 无法从 AIX 解析 DNS 地址:UnknownHostException

    我遇到了这个奇怪的错误 在 AIX 上 如果我可以从命令行访问我的服务器 使用 ping telnet 但是如果我尝试使用 java 我会遇到 UnknownHostException 这是因为 Java 无法以某种方式 使用 DNS 但我
  • 我应该在 grails 应用程序中的哪里放置瞬态域类?

    我应该在 grails 应用程序中的哪里放置瞬态域类 即我有一个Action将被传递和使用但从未保存的类 这应该是在grails app domain文件夹 还是其他地方 grails app domain用于持久域类 但并非所有应用程序的
  • Grails 2.3 IntegrationSpec 不能为事务性 false

    我最近升级到 Grails 2 3 并尝试将所有旧测试迁移到 spock 集成测试 但它在清理时失败了 因为我的测试是非事务性的 Grails 文档说测试可以是非事务性的 但我们需要手动处理它 但在这里似乎不太正确 因为我在扩展 Integ
  • grails postgres 消息:错误:列 this_.id 不存在

    grails 和 postgres 用于用户域 Message ERROR column this id does not exist 明白问题了 对于用户域 我将 postgres 表设置为 用户 因此 默认情况下 当它尝试查询用户表时
  • UrlMappings 将 URL 指向 Grails 中的资产管道文件

    在 Grails 3 0 中 如何将 URL 映射到assets folder 例如 http localhost 8080 favicon ico gt grails app assets images bookmark ico 我尝试了
  • 如何通过列名检查MySqlDataReader中的NULL?

    我怎样才能检查NULL开放的价值MySqlDataReader 以下不起作用 它总是击中else if rdr GetString timeOut null queryResult Egresstime Logged in else que
  • 如何重写 GORM/Grails 的 addTo* 和 RemoveFrom* 方法?

    我尝试重写 Grails GORM 提供的动态方法 addTo 但它似乎不起作用 这是代码 class Match static hasMany players Player matchPlayers MatchPlayer void ad
  • SQL - 用 varchar 替换 is null 整数

    我正在尝试用新的列替换列varchar如果 select 语句中存在空值 则为字符串 personid ISNULL personid no person 我不想更新它 只是在查询结果中将值显示为 无人 但我收到一条错误消息 将 varch
  • 使用 EntityFramework 使用空参数值调用存储过程

    我在 sqlserver 2008 上有一个存储过程 其中一个参数接受空值 我不知道如何使用参数上的空值来调用该 SP 为了获得更多上下文 我正在使用 EntityFramework 6xx 在下一个示例中 参数 status Compat
  • Docker DNS 设置

    我尝试使用自定义网络和 dos 设置创建 docker 容器 docker网络创建 driver bridge opt com docker network bridge enable ip masquerade true opt com
  • grails 上的同步块在 Windows 上有效,但在 Linux 上无效

    我有一个 grails 应用程序 它依赖于服务中的同步块 当我在 Windows 上运行它时 同步按预期工作 但当我在 ams linux 上运行时 会出现 StaleObjectStateException 该问题在以下示例中重现 cla
  • withTransaction 和 withNewTransaction 有什么区别?

    以下动作有什么区别 def someAction User withTransaction and def someAction User withNewTransaction 我什么时候用什么 当 grails 操作仅包含 Transac
  • Grails Asset-pipeline 不加载角度部分模板

    我将 angular ui bootstrap 与 Grails 2 3 x asset pipeline 1 6 1 插件一起使用 其中一个组件 alert js 正在尝试加载 template alert alert html 但这会解
  • grails/mysql 时区更改

    完成更改应用程序时区的最佳方法是什么 在我看来 必须发生以下情况 服务器 TZ 已被系统管理员更改 mysql必须重新启动 数据库中每个基于时间的列都必须使用convert tz 或等效方法更新所有值 因此 要么必须编写一个 mysql 脚
  • 无法创建“DependencyManagementReportTask”类型的任务。 Gradle 新手

    我是 Grails 3 和 Gradle 的新手 我正在努力将应用程序 2 4 4 更新到 Grails 3 2 8 通过升级 我想从头开始构建一个插件 我无法使用声明依赖项的标准方法将其包含到项目中 我正在尝试使用 gradle 构建 g
  • 如何在c中的某个位置终止字符指针?

    我试图通过设置空终止符来终止 c 中的字符指针 在特定位置 例如 如果我有一个 char 指针 char hi hello 我希望它是 hell 通过设置o为空 我尝试过使用 strcpy 来执行此操作 例如 strcpy hi 4 0 但

随机推荐