我需要调用一些返回各自记录的存储过程,这些记录不会直接映射到表或视图.
我过去使用过存储过程groovy.sql.Sql
和普通(未建模)映射,但对于这个应用程序,我想用类似于域类的东西对这些记录进行建模,以便定义数据类型,数据绑定,验证,与其他实体的关联, 等等.
这样做的最佳方法是什么?
我应该将存储过程记录建模为正确的域类(实体),然后尝试禁用(或重新定义)其数据库持久性吗?怎么样?
我应该使用非域POJO来选择性地启用我需要的功能吗?(例如验证@Validatable
)我如何处理关联呢?(当从SP返回的记录包含到某个其他持久实体的外键时,就会出现关联.)
如果您希望以简单的方式维护数据绑定,验证和关联,那么您应该使用Domain方法.
要禁用域类的数据库持久性,可以添加static mapWith = "none"
到域类,并且不会为该域类创建表.
示例实体类:
@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
现在迭代列表并创建一个新的实体对象
Listlist = results.collect { new MyDomain(it) } System.err.println(list)
缺点:
您无法映射标识符字段
您必须再次迭代结果以创建实体对象
您无法映射hasMany关系
如果你想使用pojo,那么在这种情况下你必须创建自己的getter版本来获取相关对象.