web-dev-qa-db-ja.com

Spring Data JPADistinct-1つの列から結果を返します

特定のリクエストが現在どのような状態にあるか(たとえば、保留中、承認済み拒否など)を定義するSTATEフィールド(文字列/テキスト)を含むデータがあり、その列からすべての一意の値を取得できます次のTSQLクエリを実行します

_SELECT DISTINCT STATE FROM CALLOUT_REQUEST_

ここで、_CALLOUT_REQUEST_は私のテーブル名であり、STATEは次のようなものを返すフィールドです。

状態

  • 承認済み
  • 拒否されました
  • 保留中
  • .。

ただし、「by」ステートメントまたはSTATEに基づいて取得できるその他のフィルターメカニズムが必要なようであるため、リポジトリでクエリに変換する方法がわかりません。

上記の生のTSQLクエリに示されているように、私が返したいのは、すべてのSTATEフィールドにすべての一意の/異なる値を含むある種のListまたはArrayオブジェクトです。

したがって、擬似コードでは、次のようなものを探していると思います。

String[] states = repository.findDisinctState();

ここで、findDistinctState()はソートの配列を返します。

それが理にかなっていることを願っています-私はJavaとSpring全般に非常に慣れていないので、上記を利用するための概念的な知識が不足していると思います。

更新:

'state'の概念は閉じているので、列挙型として実装できます-唯一の問題は、その方法がわからないことです:)達成しようとしていることと完全に一致すると思うので、どのようにそれを行うことができるかを調べます。

提供されたクエリから取得したリストは、すべての発生のカウントを取得するために使用することを目的としています。 '状態'のそれぞれの合計数を取得するために、以前にこのコードを使用しました。

_Map stats = new HashMap();
String[] states = {"approved", "denied", "pending", "deactivated"};
for (int i = 0; i < states.length; i++) {
    stats.put(states[i], repository.countByState(states[i]));
}
_

上記のコードスニペットにある状態Arrayが列挙型に変換される可能性があり、カスタム_@Query_も必要ないことを理解しているのは正しいですか?

3

そのstateの概念が閉じていて、それが可能な値のセットであることがわかっている場合は、列挙型である必要があります。

その後、次のように呼び出すことができます クエリの作成

repository.findByState(State.APPROVED)

列挙型を作成できない場合は、個別の値を取得するための別のメソッドが必要です。これは、CalloutRequestsのリストではなく文字列のリストが必要なため、JPAでは提供できません。次に、次のように手動でクエリを指定する必要があります。

@Query("SELECT DISTINCT State FROM CALLOUT_REQUEST")
List<String> findDistinctStates();
8
Luís Soares

これには、@org.springframework.data.jpa.repository.Queryアノテーションを付けてJPQLクエリを使用できます。

@Query("select distinct state from CalloutRequest")
List<String> findDistinctStates();
3
meskobalazs