域字段:
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
}
我似乎找不到使用 transient 字段“expiryDate”或使用 getMechExpiredStatus 方法来编写 createCriteria 的方法。
我尝试使用其他过滤器获取项目列表,然后单独删除对过期过滤器无效的项目,但 PagedResultList 未正确更新;它只返回当前分页结果列表。我也找不到有关 PagedResultList 对象的太多帮助。由于某种原因,删除和添加返回 bool 值。显然我不太了解这个物体。
如果我从初始条件列表中删除最大值和偏移量,查询将需要非常很长的时间来运行。
有什么想法可以实现这一点吗?
最佳答案
我通过在 View 中设置过期状态和日期并将其链接到域对象来解决这个问题。效果很好!
关于hibernate - Grails createCriteria 并使用 Transient 字段和 PagedResultsList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25436734/