web-dev-qa-db-fra.com

Données de printemps: Le référentiel JPA findAll () doit renvoyer * Map au lieu de List?

J'ai une interface de référentiel Spring Data JPA qui ressemble à ceci:

@Repository
public interface DBReportRepository extends JpaRepository<TransactionModel, Long> {

    List<TransactionModel> findAll();
    List<TransactionModel> findByClientId(Long id);
}

Existe-t-il une solution de contournement pour faire la même chose, mais pour une collection à renvoyer de type HashMap<K, V>? J'ai parcouru les classes de données Spring et je n'ai trouvé rien d'autre que les valeurs de liste <>.

5
Deniss M.

Je ne pense pas que vous trouviez une solution plus simple pour créer un seul support permettant de convertir votre résultat en carte. C'est simple et rapide avec Java 8 lambdas:

Map<Long, Transaction> transactionMap = transactionList.stream()
         .collect(Collectors.toMap(Transaction::getId, Function.identity()));
13
Patrick

Il suffisait de résoudre quelque chose de similaire et la réponse de Patricks a aidé, mais cela peut être amélioré en indiquant où l'ajouter. 

Pour faire en sorte que le référentiel JPA renvoie une carte, une amélioration consisterait à intégrer cette méthode dans une méthode par défaut dans l'interface du référentiel. Vous évite d'avoir à exécuter un flux dans toutes les classes consommatrices.

@Repository
public interface DBReportRepository extends JpaRepository<TransactionModel, Long> {

    List<TransactionModel> findAll();

    default Map<Long, TransactionModel> findAllMap() {
        return findAll().stream().collect(Collectors.toMap(TransactionModel::getId, v -> v));
    }

    List<TransactionModel> findByClientId(Long id);

    default Map<Long, TransactionModel> findByClientIdMap(Long id) {
        return findByClientId(id).stream().collect(Collectors.toMap(TransactionModel::getId, v -> v));
    }
}
1
Matt R