web-dev-qa-db-ja.com

Spring CrudRepository findByInventoryIds(List <ロング> inventoryIdList) - IN句と同等

Spring CrudRepositoryでは、フィールドに対して "IN句"をサポートしていますか?すなわち次のようなもの?

 findByInventoryIds(List<Long> inventoryIdList) 

そのようなサポートが利用できない場合、どんな優雅な選択肢が考慮されることができますか?各IDに対してクエリを実行するのは最適ではないかもしれません。

131
Espresso

findByInventoryIdIn(List<Long> inventoryIdList)がうまくいくはずです。

HTTPリクエストパラメータのフォーマットは次のようになります。

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

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

224
Oliver Drotbohm

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

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

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

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

@ 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);

}
14
Dzinot