我试图为我们的Grails应用程序应用Hibernate java域类。该表包含一些列实际上是一组不相关的固定长度子字段(例如列COL_A CHAR(10)包含子字段SF_A1 CHAR(2),SF_A2 CHAR(1),SF_A3 CHAR(3),其余未使用,这些子字段对于数据库是未知的,数据库仅知道COL_A)。为了让开发人员的生活更轻松,我使用sfA1,sfA2,sfA3属性定义了域类,因为它们具有商业含义,使COL_A离开游戏,因为它只是一个随意的空间。
我定义了自定义INSERT和UPDATE查询,以使此方案与SQLInsert和SQLUpdate注释一起使用,并且它们确实有效。我还设法用NamedNativeQuery和Loader注释加载记录。我无法自定义的是由控制器的索引方法中调用的domainClass.list方法生成的查询。它生成查询,例如"选择...,SF_A1,SF_A2,SF_A3,......来自..."并且此查询失败,因为数据库不知道SF_An列。所以问题是:是否可以使用Hibernate / javax.persistence注释覆盖某些自定义查询在domainClass.list方法中生成的查询?
PS:是的,我有备份计划来定义该表的视图,并明确声明所有必需的子字段,但我更喜欢只在存在时使用java方式。
答案 0 :(得分:0)
如果您愿意,可以使用元编程覆盖Groovy中的任何方法。在Grails的上下文中,将其放在BootStrap.groovy
中将覆盖GORM中的list
方法:
Foo.metaClass.static.list = {->
// my custom impl here
}
答案 1 :(得分:0)
您可能应该将GORM模型中的这些列/字段定义为瞬态
http://grails.org/doc/2.3.4/ref/Domain%20Classes/transients.html
这将告诉GORM不要将它们视为真实的字段。然后我会在你的GORM映射中使用COL_A这样的东西
class MyDomain {
static transients=['sfA1','sfA2','sfA3']
String sfA1
String sfA2
String sfA3
String colA
static mapping = {
//Mappings for colA go here
}
public String getSfA1() {
return colA?.substring(0,2)
}
public void setSfA1(String value) {
//Set colA here with values in the specific position
}
}
另外,如果要更改查询(即查询这些值),我会查看GORM namedQueries。您可以在链中调用.list之前调用这些,并使用高级的hibernate标准。 (包括sqlRestriction)