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

Grails 当属性存在时获取groovy.lang.MissingPropertyException,grails,groovy,Grails,Groovy,我有一个域类,它一直工作正常。但现在我添加了一个Long属性,它从那里向南延伸 这是事故域类定义: class Accident { String fullDescription Date dateFrom Date dateTo Long lastUpdated Address address GpsPosition gpsPosition String providerDescription String link

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

这是事故域类定义:

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.contract
可能的解决方案:lastUpdated

您需要首先获取事故列表,更改:

    Accident.each {


应该修复它:-)

根据数据库中有多少
意外
实例,在数据库级别按日期进行筛选可能比每次都将整个表提取到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
——当您将其读为英文“last updated without one second ago”时,这看起来是错误的,但它是正确的,因为
LessThan
的意思是“早于”应用于
Date
对象时)

您不需要:
contract.list()。每个
God。该死。你可以写100次,但在第101次仍然失败。谢谢发布一个答案,这样我就可以接受了;-)有时候你只需要一双眼睛;-)我不熟悉这种方法。
findallbylasupdatedlessthan
是Groovy的自动注入(?)方法吗?它如何确定上次更新元素的时间?它是否保留在每个.save()上设置的隐藏字段,还是我完全错了d
findAllBy…
方法是一种转换为SQL查询的方法。并且,
lastUpdated
属性由hibernate自动维护(参见@MartinMelka的最后一段)。。。啊,对不起,我看到你的<代码> ListToBurnest属性实际上不是传统的自动更新的。你应该考虑将它的类型改为<代码> java .UTI.DATE < /C>以利用这个特性,或者如果你不想把它误认为是自动时间戳,就把它命名为其他。不知道FielAlBy方法。他们太棒了!如果我理解正确,只需在域类中具有
Date lastUpdated
属性就足以让它由Hibernate自动填充?@MartinMelka是的,
Date lastUpdated
属性将随着对象最近保存到数据库的时间自动保持最新(出于任何原因,无论是显式
.save()
还是隐式脏检查)。
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
            }
        }
    }
}