1

データベースのドメイン クラス インスタンスから、最後に更新された 20 件のレコードを取得したいのですが、特定のプロパティ (私の場合はcolor. 3 つの異なるアプローチを試しましたが、どれも期待どおりに機能していないようです。

最初のアプローチ:

def corridors = TerminKorridor.findAll([max:20, sort:'lastUpdated', order:"desc"]).color.unique();

動作しますが、20 エントリが返されません

2 番目のアプローチ:

 def corridors = corridorsCriteria.list{
            distinct("color")
            maxResults(20)
            order("lastUpdated", "desc")
         }

同じ色のエントリは削除されません。明確に機能しない

3 番目のアプローチ:

def corridors = TerminKorridor.executeQuery("Select distinct a.color from TerminKorridor a order by a.lastUpdated desc",[max:20])

同じ色のエントリを削除せず、distinct機能しません。

4

1 に答える 1

1

したがって、ここのどこかにあなたのロジックに問題があると思います。

目標は、lastUpdated 順に並べられた 20 の異なる色のリストを取得することです。

個別のリストが必要な場合は、lastUpdated で注文することはできません。意味がありません。同じ色の商品が 3 つある場合、どの lastUpdated を使用して注文しますか?

最後の 20 レコードを取得してから個別の色のリストを取得するかどうかを選択する必要があります。これにより、ほぼ確実に 20 レコード未満になります。

また

20 の異なる色のリストを取得します

ただし、いくつかのコードでこれを行うことができます。

LinkedHashSet<Color> colors = new LinkedHashSet()

try {
    TerminKorridor.findAll([sort:'lastUpdated', order:"desc"]).each {
        if (colors.size() < 20) {
            colors.add(it.color)
        } else {
            throw new GetOutOfHereException()
        }
    }
} catch(GetOutOfHereException e) {
 null
}

HQL を使用して、オブジェクト全体ではなく色のみを読み込むことで、これを改善できます。

TerminKorridor.executeQuery("select t.color from TerminKorridor t order by t.lastUpdated desc").each { ... }
于 2013-08-12T14:06:11.767 に答える