2009-10-08 8 views
3

J'essaie de mélanger HQL et SQl dans la même requête. Comme l'utilisationMix HQL et SQL dans la même requête

"de ObjectA obj, TABLE_B TBL où obj.someProp = tbl.COLUMN"

parce que mon client a besoin de modifier la requête et l'apprentissage des tables inexplorées HQL ou de cartographie est hors de question :(

Sinon mise en veille prolongée, ce que quelqu'un connaît un autre outil ORM qui peut accepter cela? une autre implémentation JPA ou JDO?

J'ai essayé cela., et bien sûr cela ne fonctionne pas. il est logique de moi aussi: les résultats ne sont pas mappés aux objets, donc il n'y a pas moyen d'obtenir des objets sans codage. s pourquoi cela ne fonctionnera pas de sitôt.

Répondre

10

Cela ne fonctionne en effet pas et je ne pense pas que ce sera jamais le cas, mais pas parce que "il n'y a aucun moyen d'obtenir des objets".

Mise en veille prolongée ne vous permettent d'utiliser plain SQL queries et offre beaucoup d'options différentes pour cartographier les résultats dans vos entités (ou objets non-entité java). Vous pouvez écrire votre requête comme:

SELECT table_A.* 
    FROM table_A JOIN table_B on table_A.some_prop_column = tableB.other_column 
WHERE ... 

et l'exécuter à partir Hibernate via:

List objectAs = session.createSQLQuery(yourQuerySQL).addEntity(ObjectA.class).list(); 

Le problème avec le mélange SQL et HQL est qu'il est très facile d'entrer dans un conflit entre eux - SQL généré à partir de HQL peut utiliser un alias de table, un autre SQL brut; SQL généré peut contenir des tables/jointures en conflit avec SQL brut, etc ...

Et c'est la fin, tout ce que vous obtenez absolument rien - il ne sera même pas aider votre cas d'utilisation. Si vous voulez que quelqu'un modifie une requête HQL/SQL "mixte", il faut encore savoir à la fois SQL et HQL - au moins au niveau nécessaire pour faire la distinction entre les deux. Cela dit, si votre utilisateur final doit pouvoir personnaliser cette requête, vous devriez peut-être utiliser Criteria API pour générer la requête dont vous avez besoin en fonction de l'entrée de l'utilisateur. Avoir l'utilisateur final modifier une requête réelle au sein de l'application est un trou de sécurité béante à moins que vous preniez des précautions extrêmes extrême.

+0

Wow - fonctionne très bien. Fonctionnalité vraiment cool et robuste avec la charge SQL et auto-entité! J'avais eu peur de devoir mapper toutes les entités HQL afin de faire quelques jointures SQL simples pour récupérer des entités d'un type. Btw. en utilisant JPA/Hibernate 4.3.7 c'était aussi simple que ceci: 'Liste < DAO > daos = em.createNativeQuery (sql, myDaoClass) .getResultList()' –