web-dev-qa-db-fra.com

Spring-Data JPA CrudRepository retourne Iterable, est-il OK de le convertir en List?

J'écris un outil de génération de code pour générer du code de câblage backend pour les applications Spring-boot à l'aide de Spring-Data-Jpa et cela m'ennuie légèrement que les méthodes du CrudRepository renvoient Iterable plutôt que List, car l'itérable ne fournit pas assez mais List le fait, donc je cherche le meilleur moyen de convertir l'itérable en liste.

J'ai vu cet article sur la modification d'un itérable en une collection et je me demandais, plutôt que d'utiliser une bibliothèque comme Guava ou d'implémenter ma propre fonction pour effectuer la conversion, pourquoi ne pas simplement le caster dans List? Y a-t-il quelque chose de mal à faire cela que je ne connais pas?

Edit: je demande parce que comme c'est un outil de génération de code, il n'est pas raisonnable de le faire générer du code qui introduit des dépendances sur des bibliothèques tierces, et écrire ma propre fonction pour faire la conversion n'est pas vraiment raisonnable non plus car il devrait vivre quelque part et je préfère ne pas avoir cela dans le code généré. Un casting simple fonctionnera, même s'il est un peu moche, mais je me demandais simplement s'il me manquait quelque chose?

24
www.debug.coach

Non, je ne pense pas que ce soit OK.

Alors qu'un List est garanti d'être un Iterable un Iterable peut ne pas être un List. Cela signifie que si vous convertissez un Iterable en List, il peut échouer lors de l'exécution. Même si cela fonctionne, rien ne garantit qu'il continuera de fonctionner à l'avenir car il pourrait changer dans les nouvelles versions de Spring Data JPA sans rompre le contrat de l'interface.

Au lieu d'utiliser un transtypage, vous devez déclarer vos propres méthodes de requête qui renvoient List.

35
Andy Wilkinson

Vous avez mentionné [spring-data-jpa] donc je suppose que vous utilisez JPA. Dans ce cas, utilisez JpaRepository au lieu de CrudRepository où les méthodes renvoient List comme vous le souhaitez.

78
Robert Niestroj

Votre interface peut encore étendre le CrudRepository, vous pouvez simplement ajouter une nouvelle méthode findAll renvoyant une liste. Comme exemple ci-dessous:

@Repository
public interface DataRepository extends CrudRepository<Data, Long> {

    @Override
    List<Data> findAll();

}

Si vous avez un référentiel "abstrait" à étendre par tous vos référentiels, vous pouvez également ajouter cette méthode, de sorte qu'elle aura un effet sur tous vos référentiels. Comme exemple ci-dessous:

@NoRepositoryBean
public interface GenericRepository<T> extends CrudRepository<T, Long> {

    @Override
    List<T> findAll();

}
15
Biga