wake-up-neo.com

Spring CrudRepository findByInventoryIds (List <Long> inventoryIdList) - entspricht der IN-Klausel

Haben wir in Spring CrudRepository Unterstützung für "IN-Klausel" für ein Feld? dh etwas Ähnliches wie das Folgende?

 findByInventoryIds(List<Long> inventoryIdList) 

Wenn eine solche Unterstützung nicht verfügbar ist, welche eleganten Optionen können in Betracht gezogen werden? Das Auslösen von Abfragen für jede ID ist möglicherweise nicht optimal.

142
Espresso

findByInventoryIdIn(List<Long> inventoryIdList) sollte den Trick machen.

Das Format des HTTP-Anforderungsparameters sieht folgendermaßen aus:

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

Die vollständige Liste der JPA-Repository-Schlüsselwörter finden Sie im aktuelle Dokumentationsliste . Es zeigt, dass IsIn äquivalent ist - wenn Sie das Verb für die Lesbarkeit bevorzugen - und dass JPA auch NotIn und IsNotIn unterstützt.

238
Oliver Drotbohm

Für jede Methode in einem Spring CrudRepository sollten Sie in der Lage sein, die @Query selbst anzugeben. So etwas sollte funktionieren:

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

Ja, das wird unterstützt.

In der Dokumentation hier finden Sie die unterstützten Schlüsselwörter in Methodennamen.

Sie können die Methode einfach in der Repository-Schnittstelle definieren, ohne die Annotation @ Query zu verwenden und Ihre benutzerdefinierte Abfrage zu schreiben. In Ihrem Fall wäre es wie folgt:

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

Ich gehe davon aus, dass Sie die Entität Inventory und die Schnittstelle InventoryRepository haben. Der Code in Ihrem Fall sollte folgendermaßen aussehen:

Die Entität

@Entity
public class Inventory implements Serializable {

  private static final long serialVersionUID = 1L;

  private Long id;

  // other fields
  // getters/setters

}

Das Repository

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

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

}
15
Dzinot