JPA Requête.getResultList() - utiliser de façon générique
Je crée une requête complexe avec plusieurs tables et de la nécessité de liste le résultat. Habituellement, je suis en utilisant le EntityManager
et carte le résultat de la JPA-Représentation:
UserEntity user = em.find(UserEntity.class, "5");
Alors je peux accéder à toutes les valeurs que l'utilisateur UserEntity
classe définit. Mais comment puis-je accéder au champ-valeurs retournées à partir d'un natif, plusieurs requête création de table? Ce que je reçois est une Liste d'Objets. C'est très bien jusqu'à présent, mais "ce qui est" de cet Objet? Tableau? Carte? Collection? ...
//simpleExample
Query query = em.createNativeQuery("SELECT u.name,s.something FROM user u, someTable s WHERE s.user_id = u.id");
List list = query.getResultList();
//do sth. with the list, for example access "something" for every result row.
Je suppose que la réponse est assez simple, mais la plupart des exemples de la juste montrer l'utilisation lorsqu'ils sont directement casting pour un targetClass.
PS: Dans l'exemple que je pouvais utiliser la classe-les mappages de cours. Mais dans mon cas, someTable
n'est pas géré par JPA, et donc je n'ai pas l'entité ni faire j'ai une classe-représentation de celui-ci, et depuis, je me joins comme 20 tables, je ne veux pas créer toutes les classes juste pour accéder à l'valeurs.
Vous devez vous connecter pour publier un commentaire.
Règle générale est la suivante:
select
contient l'expression unique et c'est une entité, alors le résultat est que l'entitéselect
contient l'expression unique et c'est un primitif, alors le résultat est que primitiveselect
contient plusieurs expressions, alors le résultat estObject[]
contenant les correspondants primitives/entitésDonc, dans votre cas
list
est unList<Object[]>
.uses unchecked or unsafe operations
?@SuppressWarnings("unchecked")
query.getResultList().stream().map(objectMapper::convertValue).collect(Collectors.toList());
Depuis JPA 2.0 un
TypedQuery
peut être utilisé:La requête ci-dessus renvoie la liste de l'Objet[]. Donc, si vous voulez obtenir de l'u.nom et s.quelque chose à partir de la liste, alors vous avez besoin pour effectuer une itération et la fonte que les valeurs pour les classes correspondantes.
list[x].object[0]
est la première valeur (u.nom) etlist[x].object[1]
est la seconde (s).quelque chose) - donc pas deassoc
accès?uses unchecked or unsafe operations
... est-il un moyen d'éviter le message d'avertissement?@SuppressWarnings("unchecked")
Si vous avez besoin d'un moyen plus pratique pour accéder aux résultats, il est possible de transformer le résultat d'une arbitrairement complexes requête SQL à une classe Java avec un minimum de tracas:
La classe doit être déclarée @Entité, ce qui signifie que vous devez vous assurer qu'il a une unique @Id.
Voici un exemple sur ce qui a fonctionné pour moi. Je pense que mettre la méthode est nécessaire dans la classe d'entité pour mapper les colonnes sql java attributs de classe.
Classe d'entité: