web-dev-qa-db-ja.com

Grailsの複数のフィールドで注文する方法は?

2つのフィールド(姓と名など)で並べられたリストを取得する方法はありますか?

_.listOrderByLastAndFirst_と.list(sort:'last, first')が機能しないことはわかっています。

41
TheBrain

この古いソリューションは機能しなくなりました。以下のmattlaryの回答を参照してください

HQLでカスタムFinderを作成するか、基準ビルダーを使用する必要がある場合があります。

MyDomain.find("from Domain as d order by last,first desc")

または

def c = MyDomain.createCriteria()
def results = c.list {
       order("last,first", "desc")
}
8
Hates_

Hates _ 基準の回答がうまくいかなかったようです。 "last,first"は、例外として"Property 'last,first' not found"。 2つのフィールドで注文するには、次の操作を実行できます。

def c = MyDomain.createCriteria()
def results = c.list {
    and{
       order('last','desc')
       order('first','desc')
    }
}
82
mattlary

これはかなり古いですが、適切な解決策を見つけるのに役立ちました。 withCriteriaショートカットを使用した「よりクリーンな」コード例:

def c = MyDomain.withCriteria {
    and {
        order('last', 'desc')
        order('first', 'desc')
    }
}
9
Arnar B

より複雑な注文基準(Grails 2.1.0でテスト済み)

def c = MyDomain.withCriteria {
    property {
        order('last', 'desc')
    }
    order('first', 'desc')
}

最初にMyDomain.property.lastでソートし、次にMyDomain.firstでソートします

5
chim

あなたはこれを行うことができます

def results=MyDomain.findAll([sort:"last",order:'desc'],[sort:"first",order:'desc']);

このコード行は、ドメインクラス「MyDomain」の結果を最初に姓で、次に人物の名でソートします。

4
maq

このクエリは、最初のフィールドに基づいて機能しています。最初のフィールドが空白の場合、2番目のフィールドによって短絡されます。

order('last','desc')
order('first','desc')
4
Nakul

私は基準が最善の策だと思いますが、Finderを最初に試して正しいことをしました。 GORMからドメインオブジェクトを取得する場合、試行する正しい順序は、動的Finder、基準、HQLです。

3
Matthew Taylor
MyDomain.findAll(sort: ['first': 'desc','last':'desc'])

grails-datastore-gorm:6.0.3で動作します

2
gerrit-hntschl

それらの項目の内容でリストを並べ替える場合、複数のプロパティに基づいて並べ替え順序を決定できるようにするいくつかのスマートを備えたコンパレーターを実装する必要があります。

Groovyスタイルのコンパレーターの例をいくつか示します here

ただし、並べ替えるリストがデータベースクエリから返されている場合は、CrteriaQueryを使用して並べ替え、その上で並べ替えることをお勧めします

0
j pimmel

同じ問題があります。私のリストはそれほど大きくないので、リンクされたドメインのフィールドでソートしたいので、グルーヴィーなソートを使用します。

def listCalendar (Calendar calendar) {
    respond CalendarData.where {
        calendar == calendar
    }.list().sort{ "$it.attraction.type?:' '$it.attraction.name" }
}