如何在 Grails 中对存储过程记录建模?

How to model stored procedure records in Grails?

我需要调用一些存储过程,这些存储过程return它们自己的记录种类,这些记录没有直接映射到表或视图。

我过去在 groovy.sql.Sql 和普通(未建模)地图中使用过存储过程,但对于这个应用程序,我想用类似于域 类 的东西对这些记录进行建模,以便定义数据类型、数据绑定、验证、与其他实体的关联等。

最好的方法是什么?

我是否应该将存储过程记录建模为适当的域 类(实体),然后尝试禁用(或重新定义)它们的数据库持久性?怎么样?

我是否应该在我有选择地启用我需要的功能的地方使用非域 POJO? (例如使用 @Validatable 进行验证)那我该如何处理关联呢? (当来自 SP 的记录 returned 包含某个其他持久化实体的外键时,关联就会出现。)

如果您希望以简单的方式维护数据绑定、验证和关联,那么您应该使用域方法。

要禁用域 class 的数据库持久性,您可以将 static mapWith = "none" 添加到域 class 并且不会为该域创建 table class.

示例实体 class:

@ToString
public class SPTest {

    Long idField

    User user

    GroupIntegrationKey integrationKey

    static constraints = {
    }

    static mapWith = "none"
}

存储过程语句:

SELECT id AS idField, user_id AS user, key AS integrationKey FROM my_domain;

为了将 SP 的结果映射到实体,您可以使用结果转换器。

Query query = session.createSQLQuery("CALL getSPData()");

List<Map> results = query.with {
    resultTransformer = AliasToEntityMapResultTransformer.INSTANCE
    list()
}

现在遍历列表并创建一个新的实体对象

List<MyDomain> list = results.collect {
    new MyDomain(it)
}

System.err.println(list)

缺点:

  1. 您不能映射标识符字段
  2. 您必须再次迭代结果才能创建实体对象
  3. 您不能映射 hasMany 关系

如果您想使用 pojo,那么在这种情况下,您必须创建自己的 getter 版本才能获取关联的对象。