Spring CrudRepository findByInventoryIds (List <Long> inventoryIdList) - эквивалент предложения IN

В Spring CrudRepository есть ли у нас поддержка "IN clause" для поля? т.е. что-то похожее на следующее?

 findByInventoryIds(List<Long> inventoryIdList) 

Если такая поддержка недоступна, какие изящные варианты можно рассмотреть? Запросы об увольнении для каждого идентификатора могут быть не оптимальными.

Ответ 1

findByInventoryIdIn(List<Long> inventoryIdList) должен сделать трюк.

Формат параметра запроса HTTP будет таким:

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

Полный список ключевых слов репозитория JPA можно найти в текущем списке документации. Это показывает, что IsIn эквивалентен - если вы предпочитаете глагол для удобочитаемости - и JPA также поддерживает NotIn и IsNotIn.

Ответ 2

Для любого метода в Spring CrudRepository вы должны иметь возможность указать @Query самостоятельно. Что-то вроде этого должно работать:

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

Ответ 3

Да, это поддерживается.

Проверьте предоставленную документацию здесь для поддерживаемых ключевых слов внутри имен методов.

Вы можете просто определить метод в интерфейсе репозитория без использования аннотации @Query и записи пользовательского запроса. В вашем случае это будет следующим:

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

Я предполагаю, что у вас есть Инвентарь и интерфейс 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);

}