如何在 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)
缺点:
- 您不能映射标识符字段
- 您必须再次迭代结果才能创建实体对象
- 您不能映射 hasMany 关系
如果您想使用 pojo,那么在这种情况下,您必须创建自己的 getter 版本才能获取关联的对象。
我需要调用一些存储过程,这些存储过程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)
缺点:
- 您不能映射标识符字段
- 您必须再次迭代结果才能创建实体对象
- 您不能映射 hasMany 关系
如果您想使用 pojo,那么在这种情况下,您必须创建自己的 getter 版本才能获取关联的对象。