6

次のようなテーブルがあります。

id    name      shade        date_created
----  -----    -------      ---------------
1     Red       bright        10-28-2012
2     Orange    light         10-28-2012
3     Red       <null>        10-24-2013
4     Orange    light         10-24-2013

望ましい結果:

id    name   value    date_created
----  -----  ------   ---------
3     Red    <null>   10-24-2013
4     Orange light    10-24-2013

この結果を得るには、GORM で何ができますか?

純粋なSQLでは、これは私が望む結果を得るクエリです:

SELECT t.name, t.shade, r.MaxTime
FROM (SELECT name, MAX(date_created) as MaxTime
      FROM colorable
      GROUP BY name) r
INNER JOIN colortable t ON t.name = r.name AND t.date_created = r.MaxTime

私が試したこと:

    def c = Color.createCriteria()
    def results = c {
        projections {
            groupProperty("name")
            max("dateCreated")
        }
    }

しかし、射影からより多くの列を取得する方法がわかりませんか? つまり、shade

4

1 に答える 1

8

Grails 2.0 以降を使用している場合は、切り離された基準でこれを行うことができます。

def colors = Color.withCriteria {
    eq "dateCreated", new grails.gorm.DetachedCriteria(Color).build {
        projections {
            min "dateCreated"
        }
    }

    projections {
        property "name"
        property "shade"
        property "dateCreated"
    }
}

クラスの明示的な使用はDetachedCriteria少し見苦しいですが、それほど悪くはありません。このクエリは Where クエリとしても実行できるはずですが、集計関数で「==」を使用できないというバグがあるようです。バグが修正されると、次のことができるようになります。

def colors = Color.where {
    dateCreated == max(dateCreated)
}.property("name").property("shade").property("dateCreated").list()

「==」を「<」に置き換えると正常に機能することに注意してください。

于 2013-01-24T11:34:51.767 に答える