Spring CrudRepository findByInventoryIds(List <Long> inventoryIdList)-IN句に相当


169

Spring CrudRepositoryでは、フィールドの「IN句」をサポートしていますか?つまり、次のようなものですか?

 findByInventoryIds(List<Long> inventoryIdList) 

そのようなサポートが利用できない場合、どのエレガントなオプションを検討できますか?各IDのクエリを実行することは最適ではない場合があります。

回答:


283

findByInventoryIdIn(List<Long> inventoryIdList) トリックを行う必要があります。

HTTPリクエストパラメータの形式は次のようになります。

Yes ?id=1,2,3
No  ?id=1&id=2&id=3

JPAリポジトリキーワードの完全なリストは、現在のドキュメントリストにあります。これは、IsIn読みやすさのために動詞を好む場合は同等であり、JPAはNotInおよびもサポートしていることを示していますIsNotIn


ありがとう、それはまさに私が探していたものでした。彼らはそれをCrudRepositoryページに文書化していますか、それともコードを読んで発見しますか?
エスプレッソ2013


ありがとう。その「宝石は付録Bに隠されています」、そうそう:)
Espresso

11
参照ドキュメントの URLが変更されました
Mayjak

1
メソッドシグネチャの場合:List <Person> findByIdIn(List <Integer> ids); エラーが発生する:原因:java.lang.NumberFormatException:入力文字列の場合: "(1、2)"
user64141

103

Spring CrudRepositoryのどのメソッドでも、@ Queryを自分で指定できるはずです。このようなものがうまくいくはずです:

@Query( "select o from MyObject o where inventoryId in :ids" )
List<MyObject> findByInventoryIds(@Param("ids") List<Long> inventoryIdList);

ありがとう、これでうまくいきます。@Queryを記述せずに、「よりクリーンな」ソリューションを探していました。
エスプレッソ

3
オリバージエルケは、これに対する答えを知っている人であり、「よりクリーンな」解決策を持っています。彼の答えを受け入れるべきだ。
digitaljoel 2013

1
すごい!私Set<String>はパラメータとして使用しましたが、うまくいきました。
BlueBird 2017

2つのパラメーターを私のメソッドに1つのリストともう1つの通常の文字列に渡したい場合はどうなりますか?そうではどのように私は私のメソッド名ならない場合
user3614936

22

はい、サポートされています。

メソッド名内でサポートさているキーワードについては、ここに提供さているドキュメントを確認してください。

@Queryアノテーションを使用したり、カスタムクエリを記述したりせずに、リポジトリインターフェースでメソッドを定義するだけです。あなたの場合は次のようになります:

List<Inventory> findByIdIn(List<Long> ids);

InventoryエンティティーとInventoryRepositoryインターフェースがあることを前提としています。ケースのコードは次のようになります。

エンティティ

@Entity
public class Inventory implements Serializable {

  private static final long serialVersionUID = 1L;

  private Long id;

  // other fields
  // getters/setters

}

リポジトリ

@Repository
@Transactional
public interface InventoryRepository extends PagingAndSortingRepository<Inventory, Long> {

  List<Inventory> findByIdIn(List<Long> ids);

}

これは、CrudRepositoryインターフェースを拡張するすべてのインターフェースで機能します。
Dzinot

1
IDのサイズが1000を超える場合、またはDBによっては特定のサイズの場合、これは機能しません。これはどう? List <Inventory> findByIdIn(List <Long> ids、Pageable pageable);
ジュリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.