Grails创建条件并使用瞬态字段和PagedResultsList



域名:

startDate: Date
length: Integer
perpetuity: Boolean
expiryDate: Transient (startDate + length (in years))

域方法——这些方法用于在一个大的过滤器表单上进行过滤,以便用户搜索4种不同的过期状态。

Date getExpiryDate() {
    if (this.startDate == null || this.length == null) {
        return null
    }
    Timestamp startDate = this.startDate;
    Calendar expirationDate = Calendar.getInstance()
    expirationDate.setTime(startDate)
    expirationDate.add(Calendar.YEAR, this.length)
    return expirationDate.getTime()
}
String getMechExpiredStatus() {
    String isExpiredString = 'Unspecified'
    Date expDate = getExpiryDate()
    if (expDate != null) {
        if (expDate < new Date()) {
            isExpiredString = 'Yes'
        } else {
            isExpiredString =  'No'
        }
    } else if (isPerpetual && startDate != null) {
        isExpiredString =  'Perpetual'
    }
    return isExpiredString
}

构建结果列表

PagedResultList getMechanisms(offset, max, sortColumn, sortOrder, filters, idsOnly = false) {
    def criteria = Mechanism.createCriteria()
    def results = criteria.list(max: max, offset: offset) {
        if (idsOnly) {
            projections {
                property('id')
            }
        }
        if (filters && filters.idFilter) {
            eq('id', filters.idFilter);
        }
    ...
    }
    if (filters && filters.expiredFilter != null && filters.expiredFilter) {
        // Do Work
        // Tried getting results and removed invalid results that do not meet the 
        // expired filter selection
    }
return results
}

我似乎找不到一种方法来写createcricriteria使用瞬态字段'expiryDate'也不使用getMechExpiredStatus方法。

我已经尝试获得与其他过滤器的项目列表,然后分别删除无效的到期过滤器的项目,但PagedResultList没有得到正确更新;它只返回当前页面的结果列表。我也找不到关于PagedResultList对象的太多帮助。由于某种原因,Remove and Add返回一个布尔值。显然,我不太了解这个对象。

如果我从初始条件列表中删除max和offset,查询将花费非常长的时间来运行。

你知道我该怎么做吗?

我通过在视图中创建过期状态和日期并将其链接到域对象来解决这个问题。工作好了!

不能查询暂态属性。根据定义,瞬态属性不存在于数据源中,因此不能作为数据源执行的查询的一部分。

为了完成你正在寻找做什么使用瞬态属性,你将需要创建自己的结果列表,而不使用数据源提供的限制和偏移特性,过滤结果,然后应用偏移和限制自己。

既然你没有提供一个例子,你的查询是我留下自己的例子:

// this could be any type of query, using list for simplicity of the example
def databasePersons = Person.list()
// assumes anAdult is a boolean transient property of person
// calculated based on age
def filteredPersons = databasePersons.findAll{ it.isAnAdult() }
// get rid of the first X records, the offset
filteredPersons = filteredPersons.drop(offset)
// only take the next X remaining records, the max
filteredPersons = filteredPersons.take(max)

相关内容

  • 没有找到相关文章

最新更新