Mysql 在createCriteria中使用属性值

Mysql 在createCriteria中使用属性值,mysql,grails,jodatime,Mysql,Grails,Jodatime,我有两个域类,Item和Manufacturer。制造商在其上有一个属性,用于在项目即将过期时向用户发出警告(其日期存储为Joda DateTime对象)。相关字段是这样设置的 class Manufacturer { Integer expirationWarning static hasMany = [items: Item] } 及 我正在尝试创建一个项目列表,其中过期时间为从现在到现在的一段时间加上expirationWarning天。我已经在MySQL终端中正确运行

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

class Manufacturer {
    Integer expirationWarning

    static hasMany = [items: Item]
}

我正在尝试创建一个项目列表,其中过期时间为从现在到现在的一段时间加上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);

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

您不能以这种方式混合查询,但条件有一个选项可以直接添加sql,然后您可以使用
日期添加()

def itemsepringsoon=Item.createCriteria().list(max:listMax,offset:params.offset){
createAlias('manufacturer','m',CriteriaSpecification.LEFT_JOIN)

sqlRestriction('m.expiration_warning两年半后,我终于找到了这个问题的解决方案

实际上,我创建了一个临时属性,我应用了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所做的动态更新。

您实际上正在做您想做的事情。
new DateTime().plusDays('m.expirationWarning'))
返回一个Joda
DateTime
并且您正在将其与一个
DateTime
进行比较。您在考虑哪个属性?@dmahapatro每当我这样运行它时,我都会得到以下错误
没有方法签名:org.Joda.time.DateTime.plusDays()适用于参数类型:(java.lang.String)值:[m.expirationWarning]
我需要获取
m.expirationWarning
的值以插入到
plusDays()
方法中。在查询中,不要在
m.expirationWarning
周围加单引号:
le('expirationDate',new DateTime().plusDays(m.expirationWarning))
。我的猜测是它们停止了插值。@Kelly返回的
没有此类属性:m for class:grails.orm.HibernateCriteriaBuilder
请记住
m
是一个单独的表,我需要从中提取值
expirationWarning
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')
}
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')
}
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)"
    }
}