Spring JPA sélection des colonnes spécifiques
Je suis à l'aide de Spring JPA pour effectuer toutes les opérations de base de données. Cependant, je ne sais pas comment faire pour sélectionner des colonnes d'une table dans Spring JPA?
Par exemple:
SELECT projectId, projectName FROM projects
- voir ce stackoverflow.com/questions/12618489/...
- L'idée derrière JPA ne cherche pas pour des domaines spécifiques est que le coût (efficience sage) de la même apporter une colonne ou toutes les colonnes d'une ligne de la table.
- le coût n'est pas toujours le même. Ce n'est probablement pas une grosse affaire pour de plus simple, primitive sorte de types de données mais la raison pour laquelle je me suis retrouvé sur cette page parce que j'ai remarqué une simple "liste des documents" requête a été lent. Cette entité a une colonne BLOB (besoin pour le téléchargement de fichier/stockage) & je soupçonne que c'est lent parce que c'est le chargement de ces derniers dans la mémoire, même s'ils ne sont pas requis pour l'inscription de la documentation.
- Aussi loin que vous le rappelez-vous, combien de tables avaient des colonnes BLOB?
- c'était juste une table mais j'était en train de faire une "liste" de la fonction (multirow -- liste de tous les documents créés par un id). La seule raison pour laquelle j'ai remarqué que ce problème était à cause de cette simple liste de requête a été prise quelques secondes, tandis que des requêtes plus complexes sur les autres tables se passait presque instantanément. Une fois que j'ai réalisé, je savais qu'il allait souffrir de plus en plus comme des lignes sont ajoutées parce que le Printemps JPA est le chargement de chaque BLOB dans la mémoire même quand ils ne sont pas utilisés. J'ai trouvé une solution convenable pour le Printemps des données (ci-dessous), mais je pense que j'ai un encore mieux, c'est de l'APC d'annotation, je vais poster tmrw si cela fonctionne
Vous devez vous connecter pour publier un commentaire.
Vous pouvez définir
nativeQuery = true
dans le@Query
d'annotation à partir d'uneRepository
classe comme ceci:Noter que vous aurez à faire la cartographie de même. Il est probablement plus facile de simplement utiliser le mappé de recherche comme cela, sauf si vous avez vraiment besoin de ces deux valeurs:
C'est probablement la peine de regarder le Printemps de données docs ainsi.
FIND_PROJECTS
) avec levalue
nom de l'attribut (donc si c'était mon code, j'aurais dû l'écrire comme@Query(value = FIND_PROJECTS, nativeQuery = true)
, etc.Vous pouvez utiliser les projections de Spring Data JPA (doc). Dans votre cas, de créer des interface:
et ajoutez la méthode suivante à votre référentiel
Je n'aime pas la syntaxe en particulier (il ressemble un peu hacky...) mais c'est la solution la plus élégante, j'ai pu trouver (il utilise un custom requête JPQL dans la JPA référentiel de la classe):
Alors bien sûr, vous avez juste à fournir un constructeur pour
Document
qui acceptedocId
&filename
en tant que constructeur args.Dans ma situation, je n'ai besoin que le résultat json, et cela fonctionne pour moi:
dans le Contrôleur:
Object
avec une interface personnalisée, comme décrit par mpr. fonctionne parfaitementDans mon cas, j'ai créé une entité distincte de la classe sans le champs qui ne sont pas nécessaires (uniquement avec les champs sont obligatoires).
Carte de l'entité à la même table.
Maintenant, lorsque toutes les colonnes sont nécessaires-je utiliser l'ancienne entité, alors que seulement certaines colonnes sont nécessaires, j'utilise l'lite de l'entité.
par exemple
Vous pouvez créer quelque chose comme :
Cela fonctionne quand vous savez que les colonnes à extraire (et cela ne va pas changer).
ne fonctionnera pas si vous avez besoin de décider, de manière dynamique les colonnes.
Je pense que le plus facile est peut-être l'aide d' QueryDSL, qui vient avec le Printemps de Données.
À l'aide de votre question, la réponse peut être
Le gestionnaire d'entité peut être Autocâblés et vous avez toujours travailler avec l'objet et le clases sans utiliser *QL langue.
Comme vous pouvez le voir dans le lien, le dernier choix semble, presque pour moi, plus élégant, qui est, à l'aide de DTO pour stocker le résultat. S'appliquent à votre exemple qui sera:
Définition ProjectDTO comme:
À mon avis, c'est une grande solution:
et de l'utiliser comme
Avec le nouveau Printemps versions, On peut faire comme suit:
Si vous n'utilisez pas de requête native cela peut fait comme ci-dessous:
À l'aide de requête native la même chose peut être fait comme ci-dessous:
Pour les détails consultez le docs
Il est possible de spécifier
null
comme valeur du champ en sql natif.Vous pouvez appliquer le code ci-dessous dans votre référentiel de l'interface de la classe.
Vous pouvez utiliser JPQL:
ou vous pouvez utiliser natif sql de la requête.
À L'Aide De Requête Native:
Vous pouvez utiliser la réponse proposée par @jombie, et:
findAll()
méthode à cette fin, mais utilisez le nom de votre choix;List
paramétrées avec votre nouvelle interface (par exemple,List<SmallProject>
).