Est-il possible d'interroger "UNION" dans JPA et même "Criteria Builder"?
Je cherche des exemples, mais jusqu'à présent, je n'ai obtenu aucun résultat.
Quelqu'un a-t-il des exemples d'utilisation?
Ou serait-ce avec SQL natif?
SQL prend en charge UNION, contrairement à JPA 2.0 JPQL. La plupart des unions peuvent être réalisées en termes de jointures, mais certaines ne peuvent pas et certaines sont plus difficiles à exprimer à l'aide de jointures.
EclipseLink prend en charge UNION.
Selon le cas, on peut utiliser des sous-requêtes, quelque chose comme:
select e
from Entity e
where e.id in
(
select e.id
from Entity2 e2
join e2.entity e
where e2.someProperty = 'value'
)
or e.id in
(
select e.id
from Entity3 e3
join e3.entity e
where e3.someProperty = 'value2'
)
Une chose me vient à l’esprit (chercher exactement le même problème):
Effectuez deux requêtes JPA différentes sur le même mappage d'entité et ajoutez simplement les objets du deuxième résultat à la liste (ou à l'ensemble défini pour éviter les doublons) du premier résultat.
De cette façon, vous obtenez le même effet qu'avec UNION, à la différence que vous utilisez deux instructions SQL au lieu d'une. Mais en réalité, je m'attendrais à ce que cela soit aussi efficace qu’une seule déclaration de l’UNION.
SQL prend en charge UNION, contrairement à JPA 2.0 JPQL. [Masudul]
Une façon de résoudre ce problème consiste à effectuer plusieurs requêtes et à les ajouter à un résultat. Cela peut être plus lent, mais c'est une solution simple:
Query query = em.createQuery("SELECT p FROM Person p WHERE title = theTitle", Person.class);
Query query2 = em.createQuery("SELECT p FROM Person p WHERE firstName = theFirstName", Person.class);
List<Person> list = query.getResultList();
List<Person> list2 = query2.getResultList();
LinkedHashSet<Person> result = new LinkedHashSet<Person>();
result.addAll(list);
result.addAll(list2);
//fun with result
écrire une requête native (la mettre à true, par défaut à false) - ex.
String findQuery = "select xyz from abc union select abc from def"
@Query(value = findQuery, nativeQuery = true)
//method