在Grails中使用数据库视图

这篇文章是有关如何在Grails中使用数据库视图的快速说明。

作为介绍,我试图总结什么是数据库视图。 但是,我注意到我无法比在Wikipedia上更好地描述它。 因此,我将在此处引用Wikipedia的View(SQL)摘要:

在数据库理论中,视图是对数据的存储查询的结果集,数据库用户可以像在持久数据库集合对象中一样查询该视图。 这个预先建立的查询命令保存在数据库字典中。 与关系数据库中的普通基表不同,视图不构成物理架构的一部分:作为结果集,它是根据数据库中的数据计算或整理而成的虚拟表,当请求访问该视图时,该表是动态的。 应用于相关基础表中数据的更改反映在视图的后续调用中显示的数据中。

(维基百科)

假设我们有一个具有以下域类的Grails应用程序:

class User {
  String name
  Address address
  ...
}
class Address {
  String country
  ...
}

无论出于何种原因,我们都需要一个包含对用户名称和国家/地区的直接引用的域类。 但是,我们不想在另一个数据库表中重复这两个值。 视图可以在这里为我们提供帮助。

创建视图

此时,我假设您已经在使用Grails 数据库迁移插件。 如果您不这样做,则应该清楚地检查一下。 该插件自动包含在较新的Grails版本中,并提供了使用变更集管理数据库的便捷方法。

要创建视图,我们只需要创建一个新的变更集:

changeSet(author: '..', id: '..') {
  createView("""
      SELECT u.id, u.name, a.country
      FROM user u
      JOIN address a on u.address_id = a.id
    """, viewName: 'user_with_country')
}

在这里,我们创建一个名为user_with_country的视图,其中包含三个值:用户ID,用户名和国家。

创建域类

像普通表一样,视图可以映射到域类。 我们视图的域类非常简单:

class UserWithCountry {
  String name
  String country

  static mapping = {
    table 'user_with_country'
    version false
  }
}

请注意,我们通过将version设置为false来禁用版本控制(视图中没有版本列)。

此时,我们只需要确保在hibernate尝试在应用程序启动时创建/更新表之前执行数据库更改集即可。 这通常是通过在DataSource.groovy中禁用休眠表创建并通过将grails.plugin.databasemigration.updateOnStart设置为来启用应用程序启动时的自动迁移来完成的。
真正。 或者,这可以通过运行dbm-update命令手动执行所有新的变更集来实现。

用法

现在,我们可以使用UserWithCountry类访问视图:

Address johnsAddress = new Address(country: 'england')
User john = new User(name: 'john', address: johnsAddress)
john.save(failOnError: true)

assert UserWithCountry.count() == 1

UserWithCountry johnFromEngland = UserWithCountry.get(john.id)
assert johnFromEngland.name == 'john'
assert johnFromEngland.country == 'england'

意见的优势

我知道我在这里使用的示例不是最好的。 用户和地址之间的关系已经非常简单,这里不需要视图。 但是,如果您拥有更复杂的数据结构,则视图可能是隐藏复杂关系的好方法,而复杂关系则需要连接很多表。 如果您不想向应用程序公开表的所有列,则视图也可以用作安全措施。

参考: mscharhag,Programming and Stuff博客上的JCG合作伙伴 Michael Scharhag提供的在Grails中使用数据库视图

翻译自: https://www.javacodegeeks.com/2014/01/using-database-views-in-grails.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值