Peut JPA retourner des résultats sur une carte?
Nous sommes actuellement en train de construire une map manuelle basée sur les deux champs d'une requête nommée retourne, parce que JPA ne fournit qu'une getResultList().
@NamedQuery{name="myQuery",query="select c.name, c.number from Client c"}
HashMap<Long,String> myMap = new HashMap<Long,String>();
for(Client c: em.createNamedQuery("myQuery").getResultList() ){
myMap.put(c.getNumber, c.getName);
}
Mais je me sens comme une coutume mappeur ou similaire serait plus performant depuis cette liste pourrait facilement être 30,000+ résultats.
Toutes les idées pour construire une Carte sans itération manuellement.
(Je suis en utilisant OpenJPA, pas de mise en veille prolongée)
- Ce qui serait utilisée en tant que votre Carte de clé?
- Comme le montre le code,le numéro de champ (Long), une des deux valeurs retournées. Mais je ne pouvais vivre avec n'importe quel Type, tant que la clé est le nombre et la valeur est le nom. J'ai ajouté la déclaration pour plus de détails.
Vous devez vous connecter pour publier un commentaire.
Il n'existe pas de méthode standard pour obtenir JPA pour retourner une carte.
voir question à ce sujet: JPA 2.0 natif de résultats de la requête comme carte
Itération manuellement doit être fine. Le temps à la parcourir une liste ou une carte de mémoire va être petit par rapport au temps d'exécution/retour les résultats de la requête. Je ne voudrais pas essayer de futz avec la JPA des éléments internes ou de personnalisation sauf s'il y a une preuve concluante que le manuel de l'itération n'était pas réalisable.
Aussi, si vous avez d'autres endroits où vous tournez résultat de la requête dans les Listes de Cartes, vous voulez probablement à refactoriser que dans un utilitaire de méthode avec un paramètre pour indiquer la carte de propriété de la clé.
Vous pouvez récupérer une liste de java.util.Carte.Entrée à la place.
Par conséquent, la collecte dans votre entité doit être modélisé comme une Carte:
Dans l'exemple PhoneType est une simple énumération, un Numéro de téléphone est une entité. Dans votre requête, utilisez la
ENTRY
mot-clé qui a été introduit dans JPA 2.0 pour carte des opérations:Vous êtes maintenant prêt à récupérer les entrées et commencer à travailler avec elle:
Si vous avez encore besoin d'entrées dans une carte, mais ne veulent pas parcourir la liste de vos entrées manuellement, jetez un oeil sur ce post Convertir Set<Map.Entrée<K, V>> pour HashMap<K, V> qui fonctionne avec Java 8.
Cela fonctionne bien.
Référentiel de code :
service.java
lien https://codereview.stackexchange.com/questions/1409/jpa-query-to-return-a-map
Comment à ce sujet ?
et
À la coutume résultat
class
et un peu de Goyave, c'est mon approche qui fonctionne très bien:...
Veuillez vous référer, JPA 2.0 natif de résultats de la requête comme carte
Dans votre cas dans
Postgres
, il serait quelque chose comme,Veuillez noter, je suis juste partage de ma solution avec Postgres.