2017-09-17 2 views
0

Selon le dernier Hibernate docs section 17.3, cela devrait fonctionner:Est-ce que HQL est toujours pris en charge dans les appels NativeQuery dans Hibernate 5?

List<Person> persons = session.createNativeQuery(
     "SELECT * FROM Person", Person.class) 
    .getResultList(); 

J'ai une question presque identique et je reçois une exception:

java.sql.SQLException: Invalid object name 'Person' 

J'utilise hibernate-core-5.2.10 .FINAL. Après avoir parcouru la source, il ne se ramifie jamais pour regarder le graphe d'entité comme le fait une requête HQL normale.

Quelqu'un d'autre voit cela? Je peux poster plus de détails pour les curieux, et ajouterai plus de choses pendant que je continue à déboguer ...

J'ai couru la même question après avoir rétrogradé Hibernate à 5.0.12 avec le même résultat. Bien que dans Hibernate 5.0 il n'y ait pas de méthode "nativeQuery" sur la session, c'est "createSQLQuery" qui crée un objet "SQLQuery". Le Hibernate 5.0 Users Guide section 17.3 dit le texte même si:

List<Person> persons = session.createSQLQuery(
     "SELECT * FROM person") 
    .addEntity(Person.class) 
    .list(); 
+0

Peut-être partager la requête. Près identique est un peu d'un oxymore .... – Namphibian

+0

True! Travailler sur la réplication dans une ancienne version d'Hibernate. Possible J'essaie de faire quelque chose qui n'a jamais été supporté. Va poster plus de détails dès que je suis capable. Merci d'avoir commenté. – ECDragon

Répondre

0

Aha! Réponse: Non, et HQL n'a jamais été pris en charge dans les appels Hibernate NativeQuery.

J'ai mal interprété la documentation. Quand je lis

("SELECT * FROM Person", Person.class) 

... comme les arguments pour createNativeQuery, je supposais capitalisé « Personne » était une entité et mapperait à quel nom tableau a été spécifié dans Person.class. Ce n'est pas le cas et cela n'a jamais été le cas. La méthode createNativeQuery() se comporte de la même manière que l'ancienne méthode createSQLQuery(), et affiche simplement la chaîne de requête AS IS jusqu'à la base de données, sans effectuer de traduction de mappage d'entités à la baisse. La seule raison pour laquelle vous spécifiez l'argument de deuxième classe est de marshaler des variables ResultSet dans un objet après que la requête que vous lui avez fournie est terminée et a renvoyé des résultats. Il est plus clair dans les anciens documents avec le minuscule « personne »:

"SELECT * FROM person" 

... mais pas réel clair, bien que Hibernate docs sont encore mieux que beaucoup des documents d'autres bibliothèques. De toute façon, NativeQuery (s) sont comme l'ancienne SQLQuery (s), et simplement exécuter SQL natif et essayer de vous aider Marshal le ResultSet (s).

Oh, et l'exception! Pourquoi ai-je eu l'exception? Étant donné que ma classe Person ne correspond pas à une table nommée "Person", elle a échoué lors de l'exécution de la requête.