是否可以在Grails中为列表方法指定自定义查询?

时间:2014-05-12 13:05:26

标签: hibernate grails

我试图为我们的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方式。

2 个答案:

答案 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)