Jointure interne avec select sur HQL
Je veux faire quelque chose comme ça avec HQL:
SELECT *
FROM tableA a
INNER JOIN (select fieldA, sum(fieldB) as sum from tableB) b
ON a.fieldA = b.fieldA and a.fieldC = b.sum;
Mais cela donne une erreur:
org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: (...
Il n'y a aucun moyen de faire cela à l'aide de requêtes HQL et mise en veille prolongée?
Non, HQL n'autorise pas l'intérieur sélectionne dans cette position. Il y a peut être un moyen pour vous de reformuler ce que, si.
OriginalL'auteur Montolide | 2012-08-02
Vous devez vous connecter pour publier un commentaire.
essayer le natif SQL approche de la solution:
besoin toimport cette première:
puis, quelque part dans votre code:
en savoir plus sur ce lien
et ICI (
Rejoint dans Hibernate Query Language)
Juste essayé la solution avec le SQL, et ce que je ne savais pas, c'est que vous pouvez définir le résultat de l'entité à l'aide de
query.addEntity(TableA.class)
, sinon le résultat serait un tableau d'Objets. Ainsi, de cette façon fonctionne parfaitement pour moi. Merci!OriginalL'auteur John Woo
Vous pouvez essayer de faire une telle chose avec HQL:
Il devrait fonctionner similaires à votre sql. À propos de votre déclaration - que je sais que vous ne pouvez pas utiliser point de vue interne dans les requêtes HQL, car il est orienté objet.
Ici est un bon l'article sur les jointures dans les requêtes HQL.
EDIT:
Selon les notes de user1495181 requête ci-dessus peut être réécrite de la manière (mais je ne suis pas sûr):
Mais je préfère la première variante, parce que pour moi, c'est plus compréhensible (surtout pour les peuples qui ont l'habitude de travailler avec SQL natif).
Merci à vous pour l'édition). J'ai manqué à changer et où.
J'aime la façon dont vous réécrire les requêtes hql, mais je ne sais pas si cela pourrait fonctionner pour mon cas (qui est plus complexe que mon exemple de requête :P). À l'aide de SQL natif est mieux pour moi, dans ce cas 😉
OriginalL'auteur dimas
Vous ne pouvez pas définir la jointure avec les mots-clefs. Hibernate savoir comment faire la jointure basée sur votre cartographie.
Si vous définissez une relation dans le mappage entre a et b que hibernate va faire la jointure basée sur la relation que vous avez défini.
Si vous avez de la relation entre a et b que de faire une jointure interne, sans l'aide et mettez les critères de jointure dans la clause where
Supposons que vous ayez Gestionnaire(1:m)Employe. La relation entre eux est défini dans le hibernate mapping (un-à-plusieurs), donc quand vous voulez à la requête pour le gestionnaire que leur salarié a un salaire plus grand que 100 que vous n'avez pas besoin de spécifier la relation dans la requête comme vous le faites dans la requête SQL avec la rejoindre ...sur. Avec hibernate vous de requête " de manager m joindre à m.employé (e) s où e. salaire > 100 (je n'ai pas de spécifier comment le faire la jointure . hibernate connaître par la cartographie). Toutefois, si votre jointure n'est pas défini dans la cartographie (pas de bonnes pratiques) que vous pouvez faire explicite rejoindre dans le cas:
à partir du Gestionnaire de m,Employé (e) s où m.id = e.manager_id
OriginalL'auteur Avihai Marchiano