0

Item と Manufacturer の 2 つのドメイン クラスがあります。メーカーには、アイテムの有効期限が近づいているときにユーザーに警告するプロパティがあります (その日付は Joda DateTime オブジェクトとして保存されます)。関連するフィールドはそのように設定されています。

class Manufacturer {
    Integer expirationWarning

    static hasMany = [items: Item]
}

class Item {
    DateTime expirationDate

    static belongsTo = [manufacturer: Manufacturer]
}

有効期限が現在から現在までの時間に有効期限警告日を加えたアイテムのリストを作成しようとしています。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')
}

しかし、DateTime.plusDays() でそのフィールドの値を使用するために、「m.expirationWarning」の代わりに何を配置すればよいかわかりません。これに関するガイダンスは非常に役立ちます。

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 に追加されるものをin に書くことに注意してください。そのSQLため、ドメイン クラスの属性ではなく、データベース列の名前を使用します。

于 2013-05-10T19:29:54.563 に答える
0

2 年半後、私はついにこの問題の解決策を見つけました。

事実上、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 に答える