choisir entre deux tables avec JPQL
Question
J'utilise JPQL
pour récupérer des données. Je peux obtenir des données en utilisant l'instruction
List persons = null;
persons = em.createQuery("select p.albumName from PhotoAlbum p , Roleuser r
where r = p.userId and r.userID = 1");
Maintenant, je peux obtenir les noms d'album en utilisant ceci:
int i=0;
for (i=0;i<persons.size(); i++)
{
System.out.println("Testing n "+ i +" " + persons.get(0));
}
Maintenant, je veux obtenir le nom de l'album et la ligne du nom de firstname
du roleuser
J'utilise la requête
persons = em.createQuery("select r.firstName , p.albumName from PhotoAlbum p ,
Roleuser r where r = p.userId and r.userID = 1").getResultList();
Maintenant, comment puis-je obtenir le prenom de lignes et ALBUMNAME comme persons.get (0) renvoie un objet
en exécutant le code:
for (i=0;i<persons.size(); i++)
{
//r = (Roleuser) persons.get(i);
System.out.println("Testing n "+ i +" " + persons.get(i));
}
Je reçois ceci:
Testing n 0 [Ljava.lang.Object;@4edb4077
INFO: Testing n 1 [Ljava.lang.Object;@1c656d13
INFO: Testing n 2 [Ljava.lang.Object;@46dc08f5
INFO: Testing n 3 [Ljava.lang.Object;@654c0a43
Comment cartographier les persons.get(0)
et obtenir le firstname
et albumname
?
La solution
Maintenant, comment voulez obtenir les lignes FirstName et ALBUMNAME comme persons.get (0) renvoie un objet
Requêtes avec plusieurs select_expressions dans la clause SELECT renvoyer un Object[]
(ou un List
de Object[]
). De la spécification JPA:
4.8.1 Résultat Type de clause SELECT
Le type du résultat de la requête spécifiée par la clause SELECT d'une requête est un entité type de schéma abstrait, un le type de champ d'état, le résultat d'une fonction d'agrégat, le résultat d'une opération de construction, ou certains séquence de ceux-ci.
Le type de résultat de la clause SELECT est définie par les types de résultats de select_expressions contenu dans il. lorsque plusieurs select_expressions sont utilisés dans la clause SELECT, le résultat de la requête est de type
Object[]
, et la éléments de ce résultat correspond à afin de l'ordre de leur spécification dans la clause SELECT et type que les types de résultats de chacun des select_expressions .
Dans votre cas, vous voulez probablement quelque chose comme ceci:
for (i=0;i<persons.size(); i++) {
//r = (Roleuser) persons.get(i);
System.out.println("Testing n " + i + " " + persons.get(i)[0] + ", " +
persons.get(i)[1]);
}
Notez que la spécification d'une jointure interne par l'utilisation d'un produit cartésien dans la clause FROM et une condition de jointure dans la clause WHERE est moins typique que de spécifier une jointure explicite sur les relations d'entités (en utilisant la syntaxe [LEFT [OUTER] | INNER ] JOIN
). Voir toute la section 4.4.5 Joins dans la spécification.
Références
- JPA 1.0 Spécification
- Section 4.8.1 "Type de résultat de la clause SELECT"
- Section 4.8.2 "Expressions Constructor dans la clause SELECT"
- Section 4.4.5 "joint"