JPQL équivalent de requête SQL à l'aide des syndicats et de la sélection des constantes
J'ai écrit une requête SQL que, fondamentalement, sélectionne à partir d'un certain nombre de tables afin de déterminer ceux qui ont des lignes qui ont été créés depuis une date donnée. Mon SQL ressemble à quelque chose comme ceci:
SELECT widget_type FROM(
SELECT 'A' as widget_type
FROM widget_a
WHERE creation_timestamp > :cutoff
UNION
SELECT 'B' as widget_type
FROM widget_b
WHERE creation_timestamp > :cutoff
) types
GROUP BY widget_type
HAVING count(*)>0
Qui fonctionne bien en SQL, mais j'ai récemment constaté que, tandis que JPA peut utiliser des syndicats d'exercer "une table par classe" des requêtes polymorphiques, JPQL ne prend pas en charge les syndicats dans les requêtes. Ce qui laisse me demandais si JPA a une alternative que je pourrais utiliser pour accomplir la même chose.
En réalité, je serais de l'interrogation d'une douzaine de tables, pas de seulement deux, donc je voudrais éviter de faire des requêtes distinctes. Je tiens également à éviter de faire une native de requête SQL pour des raisons de portabilité.
Dans la question que j'ai lié ci-dessus, il a été demandé si les entités de la carte à widget_a et widget_b font partie de la même arborescence d'héritage. Oui, ils sont. Cependant, si j'ai choisi de leur classe de base, je ne crois pas que j'aurais un moyen de préciser les différentes constantes de chaîne pour l'enfant différent entités, serais-je? Si je pouvais choisir une entité du nom de la classe au lieu d'une chaîne-je fournir, susceptibles de servir de mon but. Mais je ne sais pas si c'est possible que ce soit. Pensées?
En fait, je ne l'utilisation de l'héritage, quand je veux requête pour les objets eux-mêmes. Et il fonctionne très bien. Mais comme la question dit, ce que je veux faire ici est de requête pour laquelle les TYPES d'entité ont été utilisés (créé) récemment, pas de requête pour les entités elles-mêmes. Si vous avez un moyen de le faire, j'aimerais savoir
OriginalL'auteur spaaarky21 | 2013-02-26
Vous devez vous connecter pour publier un commentaire.
J'ai fait un peu plus de recherche et trouvé un (apparemment obscur) de la fonction de JPA qui sert mon but parfaitement. Ce que j'ai trouvé est que JPA 2 a un
type
mot-clé qui permet de limiter les requêtes polymorphiques à une sous-classe, comme suit:J'ai trouvé que JPA (ou au moins Hiberner comme une implémentation JPA) vous permet d'utiliser
type
non seulement dans les contraintes, mais aussi dans des listes de sélection. C'est environ ce que ma requête fini par ressembler à:Que la requête retourne une liste de
Class
objets. Ma requête initiale a été la sélection des littéraux de chaîne parce que c'est plus proche de ce que je pourrait avoir fait dans SQL. La sélectionClass
est effectivement préférable dans mon cas. Mais si je ne préfère choisir une constante reposant sur une entité du type, c'est exactement le scénario que Oracle de la documentation utilise pour illustrercase
états:OriginalL'auteur spaaarky21
Certains JPA prestataires de soutien de l'UNION,
http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL#UNION
mais votre requête semble très complexe, et non orientée objet, donc à l'aide d'un natif de la requête SQL serait probablement la meilleure.
type
mot-clé, ce qui est parfait pour les requêtes comme celle de ma question. Jetez un oeil à ma réponse si vous êtes curieux de connaître les détails.OriginalL'auteur James