Пошук Spring CrudRepositoryByInventoryIds (Список <Довго> інвентарIdList) - еквівалентно пункту IN


169

Чи є у Spring CrudRepository у нас підтримка «IN пункту» для поля? тобто щось подібне до наступного?

 findByInventoryIds(List<Long> inventoryIdList) 

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

Відповіді:


283

findByInventoryIdIn(List<Long> inventoryIdList) повинен зробити трюк.

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

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

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


Дякую, саме це я шукав. Чи є вони задокументовані на сторінці CrudRepository чи виявляють, читаючи код?
Еспресо

1
Він фактично вказаний у довідковій документації .
Олівер Дротбом

Дякую. Та "дорогоцінний камінь прихований у додатку В", це справедливо :)
Еспресо

11
URL-адреса довідкових документів змінено
Майяк

1
Для підпису методу: Список <Person> findByIdIn (Список <Integer> ідентифікатори); Я отримую помилку: Викликаний: 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

1
Чудово! Я використовував Set<String>як параметр, добре працював.
BlueBird

Що робити, якщо я хочу передати 2 параметрі моєму методу один список та інший звичайний рядок, чи це буде працювати? якщо так, то як я можу назвати свій метод
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 .
Дзинот

1
Це не працюватиме, якщо розмір ідентифікатора перевищує 1000 або певний розмір залежно від БД. Як щодо цього? Список <Інвентар> findByIdIn (Список <Довго> ідентифікатори, Сторінка з сторінкою);
Джулі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.