1

私は次のような関係があります。

class Foo {
    static hasMany = [bars: Bar, things: Thing]
}

class Bar {
    // Has nothing to tie it back to Foo or Thing
}

class Thing {
    // Has nothing to tie it back to Foo or Bar
}

ここに画像の説明を入力

次のパラメーターを使用した次のクエリがあります。そのほとんどは、フレキシグリッドでのページネーションに使用されます。このクエリは、 viaThingの特定のインスタンスに関連付けられているのすべてのインスタンスを取得します。したがって、私のインスタンスが私のクエリが返されることを期待するとしたら、次のようになります。BarFooBarBar1Thing1Thing2

def obj = Bar.get( 1 ) // Get Bar1
def max = params.int( "max" ) ?: 100 // Default max returned results is 100 unless otherwise specified
def offset = params.int( "offset" ) ?: 0 // Default offset is 0 unless otherwise specified
def sortname = params.sortname ?: "id" // Default is id, but could be any member of Thing that is not a "hasMany"
def sortorder = params.sortorder ?: "ASC" // Default is ASC, but could be DESC

def namedParams = [ obj: obj, max: max, offset: offset ]

Thing.executeQuery( "SELECT DISTINCT f.things FROM Foo f INNER JOIN f.things things INNER JOIN f.bars bars WHERE bars =:obj ORDER BY ${sortname} ${sortorder}", namedParams )

Hibernate では、名前付きパラメーターを使用して句を指定することは許可されていないためORDER BY、文字列を補間しました。問題は、指定したとおりに結果が順序付けられていないことです。ORDER BY idGrailsを使用するidとあいまいです。

変数sortnameが常に のメンバーであることがわかっている場合Thing、何をソートするかを指定するにはどうすればよいですか?

私が試したことのいくつか:

ORDER BY Thing.id // Fail
ORDER BY f.things.id // Fail
ORDER BY things.id // FAIL!
4

1 に答える 1

2

クエリは次のようになります。

SELECT DISTINCT thing FROM Foo f 
INNER JOIN f.things thing 
INNER JOIN f.bars bar 
WHERE bar = :obj 
ORDER BY thing.id

つまり、エンティティのパスの代わりに select 句でエンティティのエイリアスを使用し、order by 句で同じエイリアスを使用する必要があります。

于 2012-06-22T08:54:32.747 に答える