Vous pouvez utiliser id in (select id from ...) or id in (select id from ...)
par exemple, au lieu de non-travail
from Person p where p.name="Joe"
union
from Person p join p.children c where c.name="Joe"
vous pourriez faire
from Person p
where p.id in (select p1.id from Person p1 where p1.name="Joe")
or p.id in (select p2.id from Person p2 join p2.children c where c.name="Joe");
Au moins l'utilisation de MySQL, vous serez confronté à des problèmes de performances avec la suite. Il est parfois plus facile de faire un pauvre homme jointure sur deux requêtes à la place:
// use set for uniqueness
Set<Person> people = new HashSet<Person>((List<Person>) query1.list());
people.addAll((List<Person>) query2.list());
return new ArrayList<Person>(people);
Il est souvent préférable de faire deux requêtes simples que d'un seul complexe.
EDIT:
pour donner un exemple, voici les EXPLIQUER de sortie de la requête MySQL à partir de la sous-sélection de la solution:
mysql> explain
select p.* from PERSON p
where p.id in (select p1.id from PERSON p1 where p1.name = "Joe")
or p.id in (select p2.id from PERSON p2
join CHILDREN c on p2.id = c.parent where c.name="Joe") \G
*************************** 1. row ***************************
id: 1
select_type: PRIMARY
table: a
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 247554
Extra: Using where
*************************** 2. row ***************************
id: 3
select_type: DEPENDENT SUBQUERY
table: NULL
type: NULL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: NULL
Extra: Impossible WHERE noticed after reading const tables
*************************** 3. row ***************************
id: 2
select_type: DEPENDENT SUBQUERY
table: a1
type: unique_subquery
possible_keys: PRIMARY,name,sortname
key: PRIMARY
key_len: 4
ref: func
rows: 1
Extra: Using where
3 rows in set (0.00 sec)
Plus important encore, 1. ligne ne pas utiliser toute l'index et considère 200k+ lignes. Mauvais! L'exécution de cette requête a pris 0,7 s wheres les deux sous-requêtes sont en millisecondes.