2011-10-10 3 views
1

J'essaie actuellement d'extraire des données avec JQPL. Ma Recherche ressembleJQPL: Créer un nouvel objet dans la requête à partir de plusieurs tables

SELECT NEW com.test.CustomObject(t1.name, CASE WHEN(t2 IS NOT NULL) THEN true ELSE false END) FROM table1 t1, table2 t2 WHERE t1.id = :id1 AND t2.id = :id2 

Bien sûr, les deux entités iteself existent une interrogation pour l'un d'entre eux travaille. Interrogation d'une valeur fixe fonctionne aussi:

SELECT NEW com.test.CustomObject(t1.name, false) FROM table1 t1 WHERE t1.id = :id1 

Mon problème est que je reçois pas de valeur de retour si: ID2 a une valeur non existante. Au lieu de donner false au constructeur CustomObject, la ligne elle-même est complètement omise. Que puis-je faire d'autre pour savoir si le paramètre id2 a une ligne dans table2 pour passer cette valeur booléenne au constructeur personnalisé?

De plus amples informations peuvent bien sûr être fournies.

+0

Votre code n'a pas beaucoup de sens. S'il vous plaît lire attentivement http://en.wikipedia.org/wiki/Join_%28SQL%29 pour comprendre ce qui est approprié pour votre situation. – kan

+0

J'ai essayé de simplifier mon problème au cœur du problème et je me suis débarrassé de beaucoup de code supplémentaire qui rendrait l'ensemble de la requête illisible. Je n'ai pas vraiment vérifié la logique. – Johnnycube

Répondre

0

je pouvais résoudre le problème avec exsists:

SELECT NEW com.test.CustomObject(t1.name, CASE WHEN EXISTS(SELECT t2.id FROM table2 t2 WHERE t2.id = :id2) THEN true ELSE false END) FROM table1 t1 WHERE t1.id = :id1 
+0

En plus de creuser dans le problème, j'ai décidé d'aller à Native Queries. Si quelqu'un est intéressé, laissez un message – Johnnycube

2

Vous devez utiliser LEFT (OUTER) JOIN pour vous connecter de table1 à table2. Cela entraînera la partie gauche du résultat également lorsque le côté droit de la jointure n'existe pas. Dans ce cas, les valeurs provenant du côté droit (par exemple t2.id) ont des valeurs nulles.

Cela n'a pas non plus de sens de définir deux fois un identifiant en tant que paramètre (en supposant que ce que vous voulez est t1.id = t2.id). Utilisez simplement join et définissez le paramètre id une fois.

+0

merci pour votre réponse. Le problème est, que id1 n'est pas id2, donc mettre t1.id = t2.id ne ferait pas l'affaire. Comment ressemblerait la déclaration Left Outer Join. J'ai toujours pensé, que je peux Left Outer Join parties des sélections précédentes comme SELECT ... FROM table1 t1 LEFT OUTER JOIN t1.value valeur; Ce dont j'aurais besoin serait quelque chose comme SELECT ... FROM table1 t1 LEFT OUTER JOIN table2 t2 - est-ce possible? devrais-je spécifier la condition de jointure dans la clause where comme WHERE t2.id =: id2? – Johnnycube

Questions connexes