0

我有 2 个域类,项目和制造商。制造商有一个属性,用于在项目即将到期时警告用户(其日期存储为 Joda DateTime 对象)。相关字段是这样设置的。

class Manufacturer {
    Integer expirationWarning

    static hasMany = [items: Item]
}

class Item {
    DateTime expirationDate

    static belongsTo = [manufacturer: Manufacturer]
}

我正在尝试创建一个项目列表,其中到期时间介于现在和现在之间的某个时间加上 expirationWarning 天数。我已经让查询在 MySQL 终端中正常工作。

SELECT i.id FROM items as i 
   LEFT JOIN (manufacturer as m) ON (m.id = i.manufacturer_id) 
   WHERE i.expiration_date <= DATE_ADD(current_date, INTERVAL m.expiration_warning DAY);

现在我只需要在 Grails 中执行相同的查询。我知道 createCriteria 看起来像这样:

def itemsExpiringSoon = Item.createCriteria().list(max: listMax, offset: params.offset) {
    createAlias('manufacturer', 'm', CriteriaSpecification.LEFT_JOIN)
    le('expirationDate', new DateTime().plusDays('m.expirationWarning'))
    order('expirationDate', 'desc')
}

但我不知道用什么来代替“m.expirationWarning”才能在 DateTime.plusDays() 中使用该字段的值。任何有关这方面的指导都会非常有帮助。

4

2 回答 2

1

您不能以这种方式混合您的查询,但条件可以选择直接添加 sql,然后您可以使用您的date_add().

def itemsExpiringSoon = Item.createCriteria().list(max: listMax, offset: params.offset) {
    createAlias('manufacturer', 'm', CriteriaSpecification.LEFT_JOIN)
    sqlRestriction('m.expiration_warning <= DATE_ADD(current_date, INTERVAL m.expiration_warning DAY)')
    order('expirationDate', 'desc')
}

请注意,在sqlRestriction()您编写的内容将添加到 final 中SQL,因此我们使用数据库列的名称,而不是域类的属性。

于 2013-05-10T19:29:54.563 回答
0

两年半后,我终于找到了解决这个问题的办法。

实际上,我创建了一个应用 GORM 公式的瞬态属性,它表示当前日期加上制造商指定的到期警告。

class Item {
    Date expirationDate
    Date pendingExpiration

    static belongsTo = [manufacturer: Manufacturer]
    static mapping = {
         pendingExpiration formula: "(SELECT ADDDATE(current_date, mfr.expiration_warning) FROM manufacurer mfr WHERE mfr.id = manufacturer_id LIMIT 1)"
    }
}

现在我可以查询这个属性,它会像 Manufacturer.expirationWarning 一样动态更新。

于 2015-12-10T22:43:56.690 回答