263 votes

Spring CrudRepository findByInventoryIds(List<Long> inventoryIdList) - équivalent à la clause IN

Dans Spring CrudRepository, avons-nous un support pour la "clause IN" pour un champ ? c'est-à-dire quelque chose de similaire à ce qui suit ?

 findByInventoryIds(List<Long> inventoryIdList) 

Si ce soutien n'est pas disponible, quelles options élégantes peuvent être envisagées ? Lancer des requêtes pour chaque identifiant n'est pas forcément optimal.

416voto

Oliver Gierke Points 11630

findByInventoryIdIn(List<Long> inventoryIdList) devrait faire l'affaire.

Le format des paramètres de la requête HTTP est le suivant :

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

La liste complète des mots-clés du référentiel JPA se trouve dans le document liste de la documentation actuelle . Il montre que IsIn est équivalent - si vous préférez le verbe pour des raisons de lisibilité - et que JPA supporte également NotIn y IsNotIn .

Si inventoryId a la clé primaire, vous pouvez simplement utiliser yourRepo.findAll(inventoryIdList) .

139voto

digitaljoel Points 13557

Pour toute méthode dans un Spring CrudRepository, vous devriez pouvoir spécifier vous-même la @Query. Quelque chose comme ceci devrait fonctionner :

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

42voto

Dzinot Points 171

Oui, cela est possible.

Vérifier la documentation fournie aquí pour connaître les mots-clés pris en charge dans les noms de méthodes.

Vous pouvez simplement définir la méthode dans l'interface du référentiel sans utiliser la méthode @Query et de rédiger votre requête personnalisée. Dans votre cas, elle serait la suivante :

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

Je suppose que vous avez le Inventaire et l'entité Référentiel d'inventaire l'interface. Dans votre cas, le code devrait ressembler à ceci :

L'entité

@Entity
public class Inventory implements Serializable {

  private static final long serialVersionUID = 1L;

  private Long id;

  // other fields
  // getters/setters

}

Le référentiel

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

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

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X