web-dev-qa-db-fra.com

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

Dans Spring CrudRepository, la "clause IN" est-elle prise en charge pour un champ? c'est-à-dire quelque chose de similaire à ce qui suit?

 findByInventoryIds(List<Long> inventoryIdList) 

Si un tel support n'est pas disponible, quelles options élégantes peuvent être envisagées? Les requêtes de déclenchement pour chaque identifiant peuvent ne pas être optimales.

142
Espresso

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

Le format du paramètre de requête HTTP ressemblerait à ceci:

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 liste actuelle de la documentation . Cela montre que IsIn est équivalent - si vous préférez le verbe pour la lisibilité - et que JPA prend également en charge NotIn et IsNotIn.

238
Oliver Drotbohm

Pour toute méthode dans un Spring CrudRepository, vous devriez pouvoir spécifier vous-même le @Query. Quelque chose comme ça devrait marcher:

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

Oui, c'est supporté.

Consultez la documentation fournie ici pour 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 l'annotation @ Query et écrire votre requête personnalisée. Dans votre cas, ce serait comme suit:

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

Je suppose que vous avez l'entité Inventory et l'interface InventoryRepository . Le code dans votre cas 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);

}
15
Dzinot