Spring Data JPA. Comment obtenir uniquement une liste d'ID de la méthode findAll ()
J'ai un très compliquée modèle. L'entité a beaucoup de relations et ainsi de suite.
J'essaie d'utiliser Spring Data JPA, et j'ai préparé un référentiel.
mais quand j'invoque un metod findAll() avec la spécification de l'objet a qui ont un problème de performances, car les objets sont très grands. Je le sais parce que quand j'invoque une méthode comme ceci:
@Query(value = "select id, name from Customer ")
List<Object[]> myFindCustomerIds();
Je n'ai pas de problèmes avec la performance.
Mais quand j'invoque
List<Customer> findAll();
J'ai eu un gros problème avec la performance.
Le problème est que j'ai besoin d'invoquer la méthode findAll avec les Spécifications du Client, c'est pourquoi je ne peux pas utiliser la méthode qui renvoie une liste de tableaux d'objets.
Comment écrire une méthode à la recherche de tous les clients avec les spécifications du Client entité, mais qui ne renvoie qu'un IDs.
comme ceci:
List<Long> findAll(Specification<Customer> spec);
- Je ne peux pas utiliser dans ce cas la pagination.
S'il vous plaît aider.
source d'informationauteur user6778654
Vous devez vous connecter pour publier un commentaire.
Pourquoi pas à l'aide de la
@Query
annotation?@Query("select p.id from #{#entityName} p")
List<Long> getAllIds();
Le seul inconvénient que je vois est que lorsque l'attribut
id
changements, mais puisque c'est un nom commun et peu susceptible de changer (id = clé primaire), cela devrait être ok.C'est maintenant pris en charge par le Printemps des Données à l'aide Les Projections:
Que dans votre
Customer
référentielJ'ai résolu le problème.
(Comme un résultat, nous aurons une éparses Client de l'objet uniquement avec l'id et le nom)
Définir leur propre référentiel:
Et de mise en œuvre (rappelez-vous sur le suffixe - Impl par défaut)
Malheureusement Les Projections ne fonctionne pas avec spécifications.
JpaSpecificationExecutor
retour seulement une Liste de taper avec le agrégées racine géré par le référentiel (List<T> findAll(Specification<T> var1);
)Une réelle solution de contournement consiste à utiliser un Tuple. Exemple :
où
Projections
est une interface fonctionnelle pour l'utilisateur root de projection.SingleTupleMapper
etTupleMapper
sont utilisés pour mapper leTupleQuery
résultat à l'Objet que vous souhaitez retourner.Exemple d'utilisation :
J'espère que cela aide.