当属性存在时获取groovy.lang.MissingPropertyException

时间:2014-06-19 11:15:05

标签: grails groovy

我有一个工作正常的域类。但现在我添加了一个Long属性,它从那里向南走。

这是Accident域类定义:

class Accident {

    String fullDescription
    Date dateFrom
    Date dateTo
    Long lastUpdated

    Address address
    GpsPosition gpsPosition
    String providerDescription
    String link

    static constraints = {
        address nullable: true
        gpsPosition nullable: true
        providerDescription nullable: true
        link nullable: true
        fullDescription maxSize: 1024
        lastUpdated nullable: true
    }
}

这就是我收到错误的地方:

@Transactional
class DatabaseCleanupService {

    static final long timeNotUpdatedToDelete = 1 * 1000 // milliseconds

    void cleanupDatabase() {
        Accident accident

        Accident.each {
            /*ERROR AT THIS LINE*/ if (System.currentTimeMillis() - it.lastUpdated > timeNotUpdatedToDelete) { 
              // do stuff
        }
    }
}

我可以从代码的其他部分访问该属性,我成功打印调试信息,但此时,它只是崩溃。这有什么问题?


编辑:错误消息显示:

没有此类属性:lastUpdated用于类:com.quarky.nehodyprahaserver.Accident可能的解决方案:lastUpdated

2 个答案:

答案 0 :(得分:1)

您需要先获取一份事故清单,然后更改:

    Accident.each {

    Accident.list().each {

应该修理它: - )

答案 1 :(得分:0)

根据数据库中有多少Accident个实例,在数据库级别按日期进行过滤可能效率更高,而不是每次都将整个表提取到Groovy对象中并过滤后组织:

import groovy.time.TimeCategory

@Transactional
class DatabaseCleanupService {

    static final long timeNotUpdatedToDelete = 1 * 1000 // milliseconds

    void cleanupDatabase() {
        use(TimeCategory) {
            Accident.findAllByLastUpdatedLessThan(
              timeNotUpdatedToDelete.milliseconds.ago).each {

                // do stuff
            }
        }
    }
}

(或者只是将常量内联为1.second.ago - 当你把它读作英文“上次更新不到一秒钟”时,这看起来很错误,但这是正确的,因为LessThan的意思是“早于”当应用于Date个对象时)