web-dev-qa-db-fra.com

Requête UNION to JPA

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?

13
Giovane

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.

21
Masudul

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'
)
19
szczepanpp

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.

5
cslotty

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
0
Xanlantos

é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
0
Pravin