【问题标题】:Grails Domain class association with stored procedure resultsetGrails 域类与存储过程结果集的关联
【发布时间】:2026-02-02 13:05:02
【问题描述】:

大家好,

是否可以将存储过程的结果集关联到 grails 域类...?

我将这个数据库视图映射到一个域类,它的工作原理就像一个魅力,但在一个典型的功能中,我需要根据最终用户给出的某些参数生成数据库视图。在那种情况下,我无法将参数传递给数据库视图,所以我创建了一个存储过程,它会给我与视图相同的结果集,但在涉及多个表的计算和从最终用户获取参数之后。

在 grails 视图 (list.gsp) 中,我使用的大部分插件都是基于域类的,例如:filterpane。 所以我不能简单地将存储过程中的结果显示到 grails 中

我是 grails 的新手。我已经浏览了 grails fromms,用谷歌搜索了很多,但无法在这个主题中得到任何建议。

【问题讨论】:

  • 阿米特,不太清楚我们必须在这里处理什么。你不能在你的域类中使用“findBy(xyz)”吗?每当我需要做听起来像你想做的事情时,我都会创建一个名为 XXXReport 的域类,其中包含我感兴趣的字段,然后多亏了石英,我可以安排它以我希望的频率运行。跨度>
  • @marko,正如我所说,我有一个映射到域类的数据库视图,从不同的表中选择记录。现在我需要根据输入值做一些内部逻辑,比如说最终用户给出的开始日期和结束日期。所以要根据内部逻辑而不是数据库视图来构建列表。为此,我创建了 db 存储过程。现在我的问题是如何关联我将从存储过程中获得的结果集。使用映射到 grails 域类的视图..
  • 抱歉回复晚了,你有解决什么问题吗?

标签: mysql grails stored-procedures views gsp


【解决方案1】:

Grails 提供transient fields 供您在需要域类中的计算字段时使用。您可以将计算逻辑包装在服务中,在使用之前更改域类实例。

class MyDomain {
  BigDecimal calcField

  static transients = ['calcField']
}

class MyService {
  def dataSource

  List<MyDomain> getInstances() {
    def instances = MyDomain.findAllBy...()
    instances.each { MyDomain ins ->
       doCalcField(ins)
    }

    instances

  }

  void doCalcField(MyDomain myDomain) {
    groovy.sql.Sql sql = new Sql(dataSource)
    //call procedure, returning values as OUT
    myDomain.calcField = calcField //assign out to domain instance
  }

}

根据你的计算,最好直接在服务中做,让你的代码库独立。

【讨论】:

  • Sérgio 感谢您的回复,使用上面建议的代码,我们可以将内部逻辑/计算应用于域对象,但在我的情况下,我已将 db 视图映射到域类,正如您所知,视图只不过是简单的从不同的表中选择记录。现在有了我在存储过程中的逻辑,我将像视图一样动态地获得结果集。但是我怎样才能将它映射到我的域类而不是直接映射到数据库视图......?正如您所建议的,我无法填充域对象并稍后进行计算,因为创建域对象本身是动态的。
  • 基本上我正在尝试将对象列表从服务/方法映射到域类,并且它不应保存在数据库中,以便控制器/视图中的逻辑保持不变不变。有没有可能……?
  • @Amit 如果您只更改临时字段,Grails 将不会尝试在数据库中更新它们。