1

从 Grails 2.2.4 迁移到 2.4.3 后,具有名为 applicationContext 的属性的域类在条件查询中使用该属性时会引发异常。

class WebResource {
     String applicationContext
}

class ResourceService {
  public WebResource getResourceByContext(String ctx) {
     WebResource.withCriteria() {
         eq('applicationContext', ctx)
     }
  }
}

调用 getResourceByContext() 会引发异常:

    org.hibernate.QueryException:无法解析属性:applicationContext of:org.mydomain.WebResource
 在 org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:83)
        在 org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:77)
        在 org.hibernate.persister.entity.AbstractEntityPersister.getSubclassPropertyTableNumber(AbstractEntityPersister.java:1995)
        在 org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns(BasicEntityPropertyMapping.java:61)
        在 org.hibernate.persister.entity.AbstractEntityPersister.toColumns(AbstractEntityPersister.java:1970)
        在 org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumns(CriteriaQueryTranslator.java:518)
        在 org.hibernate.loader.criteria.CriteriaQueryTranslator.findColumns(CriteriaQueryTranslator.java:534)
        在 org.hibernate.criterion.SimpleExpression.toSqlString(SimpleExpression.java:82)
        在 org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:417)
        在 org.hibernate.loader.criteria.CriteriaJoinWalker.(CriteriaJoinWalker.java:123)
        在 org.hibernate.loader.criteria.CriteriaJoinWalker.(CriteriaJoinWalker.java:92)
        在 org.hibernate.loader.criteria.CriteriaLoader.(CriteriaLoader.java:97)
        在 org.hibernate.internal.SessionImpl.list(SessionImpl.java:1663)
        在 org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:380)
        在 org.codehaus.groovy.grails.orm.hibernate.query.AbstractHibernateCriteriaBuilder.invokeMethod(AbstractHibernateCriteriaBuilder.java:1639)
        在 org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.java:907)
        在 org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:884)
        在 org.grails.datastore.gorm.GormStaticApi$_withCriteria_closure11.doCall(GormStaticApi.groovy:304)
        在 sun.reflect.GeneratedMethodAccessor254.invoke(未知来源)
        在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        在 java.lang.reflect.Method.invoke(Method.java:606)
        在 org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
        在 groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:324)
        在 groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1207)
        在 groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:1110)
        在 groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1016)
        在 groovy.lang.Closure.call(Closure.java:423)
        在 org.codehaus.groovy.runtime.ConvertedClosure.invokeCustom(ConvertedClosure.java:51)
        在 org.codehaus.groovy.runtime.ConversionHandler.invoke(ConversionHandler.java:81)
        在 com.sun.proxy.$Proxy29.doInSession(未知来源)
        在 org.grails.datastore.mapping.core.DatastoreUtils.execute(DatastoreUtils.java:302)
        在 org.grails.datastore.gorm.AbstractDatastoreApi.execute(AbstractDatastoreApi.groovy:37)
        在 org.grails.datastore.gorm.GormStaticApi.withCriteria(GormStaticApi.groovy:303)
        在 org.mydomain.WebResource.withCriteria(WebResource.groovy)

在 Grails 2.4.3 中不允许使用名称为“applicationContext”的域属性吗?我在 Grails 发行说明、升级指南或 JIRA 中找不到对这种情况的禁止引用。我通过重命名字段并将 GORM 引用更改为新名称来解决此问题:

class WebResource {
    String appContext
    appContext column: 'APPLICATION_CONTEXT'
    public String getApplicationContext() {
        return appContext
    }

    public void setApplicationContext(String c) {
        appContext = c
    }
}
4

1 回答 1

1

鉴于名称与 Spring ApplicationContext 冲突,我怀疑您已经找到了最佳答案 - 将属性命名为其他名称并使用mapping定义来设置数据库列名称。我建议您不要添加 getter/setter 对,而appContext直接在代码中使用属性名称,因为 Grails 核心或插件中很可能有很多地方假设(在我看来非常合理)名为的属性applicationContext是Spring 对象而不是其他任何东西。

除非必须,否则不要违背惯例。

于 2014-09-03T18:19:52.330 回答