Spring CrudRoository findByInventoryIds (Liste <Uzun> envanterIdList) - IN yan tümcesine eşdeğerdir


169

Spring CrudRepository'de bir alan için "IN yan tümcesi" desteğimiz var mı? yani aşağıdakine benzer bir şey?

 findByInventoryIds(List<Long> inventoryIdList) 

Böyle bir destek mevcut değilse, hangi zarif seçenekler düşünülebilir? Her kimlik için tetikleme sorguları en uygun olmayabilir.

Yanıtlar:


283

findByInventoryIdIn(List<Long> inventoryIdList) hile yapmalı.

HTTP istek parametresi biçimi şöyle olur:

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

JPA veri havuzu anahtar kelimelerinin tam listesi, geçerli dokümantasyon listesinde bulunabilir . Bu gösterileri IsInEğer okunabilirlik için fiilini istemezseniz - - eşdeğer olduğunu ve JPA da destekler NotInve IsNotIn.


Teşekkürler, tam da aradığım şey buydu. CrudRepository sayfasında belgelenmişler mi veya kodu okuyarak mı keşfettiler?
Espresso

1
Aslında referans belgelerinde listelenmiştir .
Oliver Drotbohm

Teşekkürler. Bu "mücevher ek B'de gizli", haklı olarak :)
Espresso

11

1
Yöntem imzası için: List <Person> findByIdIn (List <Integer> ids); Hatayı alıyorum: Neden: java.lang.NumberFormatException: Giriş dizesi için: "(1, 2)"
user64141 14:02

103

Bir Spring CrudRepository'deki herhangi bir yöntem için @Query'yi kendiniz belirtebilirsiniz. Böyle bir şey işe yaramalı:

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

Teşekkürler, bu işe yarıyor. @Query yazmadan yani "daha temiz" bir çözüm arıyordu.
Espresso

3
Oliver Gierke bunun cevabını bilen adam ve "daha temiz" bir çözüme sahip. Cevabını kabul etmelisin.
digitaljoel

1
Harika! Set<String>Bir parametre olarak kullandım , iyi çalıştı.
BlueBird

Ya bir parametre ve diğer normal bir dize benim yöntemime 2 paramemeters geçmek istiyorum, bu işe yarar? evet ise yöntemimi nasıl adlandırmalıyım
user3614936 24:18

22

Evet, bu destekleniyor.

Burada verilen belgelere bakınYöntem adları içindeki desteklenen anahtar kelimeler için .

@Query ek açıklamasını kullanmadan ve özel sorgunuzu yazmadan yöntemi depo arabiriminde tanımlayabilirsiniz . Sizin durumunuzda şu şekilde olur:

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

Sana olduğunu varsayalım Envanter varlık ve InventoryRepository arabirimi . Durumunuzdaki kod şöyle görünmelidir:

Varlık

@Entity
public class Inventory implements Serializable {

  private static final long serialVersionUID = 1L;

  private Long id;

  // other fields
  // getters/setters

}

Depo

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

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

}

Bu, CrudRepository arabirimini genişleten tüm arabirimler için çalışır .
Dzinot

1
DB'ye bağlı olarak ids boyutu 1000 veya belirli bir boyutun üzerindeyse bu çalışmaz. Buna ne dersin? List <Inventory> findByIdIn (Liste <Uzun> kimlikleri, Ücretli ödenebilir);
Julie
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.