web-dev-qa-db-ja.com

Spring Data Rest-複数のプロパティで並べ替え

私は以下のようなエンティティを持っています

Class Person{
String id;
String name;
String numberOfHands;
}

Spring Data Rest(Gosling Release Train)を使用して、指定することができます

localhost/Person?sort=name,asc

名前を昇順で並べ替えます。今、numberOfHandsの降順と名前の昇順でソートする必要がある場合。指定できます

localhost/Person?sort=numberOfHands,name,asc

しかし、私は指定することはできません

localhost/Person?sort=numberOfHands,desc,name,asc

複数のソート順を指定する方法はありますか?

ありがとう!

48
rakpan

解決策(tl; dr)

複数のフィールドでソートする場合は、sortパラメーターをURIに複数回入力するだけです。たとえば、your/uri?sort=name,asc&sort=numberOfHands,desc。その後、Spring Dataは、複数のソートを使用してPageableオブジェクトを構築できます。

説明

URIのパラメーターに複数の値を送信する方法については、実際に定義された標準はありません。 GET要求で同じパラメーター名に複数の値を渡す正しい方法 を参照してください。

ただし、 Java Servlet Spec には、Javaサーブレットコンテナがリクエストパラメータを解析する方法に関するヒントがあります。

getParameterValuesメソッドは、パラメーター名に関連付けられたすべてのパラメーター値を含むStringオブジェクトの配列を返します。 ...-Javaサーブレット仕様、セクション3.1

そのセクションのサンプルには、さらに記載されています(ただし、リクエストとボディデータが混在しています)

たとえば、a=helloのクエリ文字列とa=goodbye&a=worldの投稿本文でリクエストが行われた場合、結果のパラメーターセットはa=hello, goodbye, worldの順序になります。

このサンプルは、パラメーター(例ではa)が複数回提示されると、結果がString[]に集約されることを示しています。

76
M. Deinum

これは、手動/プログラムで複数のSortオブジェクトを作成する方法です。

Sort sort = Sort.by(
    Sort.Order.asc("name"),
    Sort.Order.desc("numberOfHands"));
return personRepository.findAll(sort);

注:このソリューションは、元の質問を直接解決するものではありませんが、バックエンドの観点からやや「ハードコード化された」方法で複数のプロパティをソートする方法を探しているときにこの質問に到達した訪問者を助けることができます。 (このソリューションは、URIパラメーターを必要としない/取らない)

12
Pim Hazebroek