2011-12-04 2 views
2

Il existe de nombreux exemples sur le net qui décrivent comment appeler une procédure stockée à l'aide de Hibernate, cependant, lorsque vous utilisez Spring, l'image change un peu.Appel de procédure stockée avec Hibernate et Spring

J'ai une procédure stockée dans MySQL que je veux appeler: dans SQL je besoin d'écrire ce qui suit:

CALL inrange(32.342324,32.234234); 
It returns a row with the following: `{INT},{INT},{FLOAT}` 

Avec le printemps, j'utilise la manière HibernateTemplate d'exécuter les opérations de mise en veille prolongée, je sais que certains d'entre vous ne l'aimeront pas, mais c'est comme ça que le projet a commencé quand je l'ai commencé, et je ne suis pas si impatient de le changer, peut-être dans le futur ...

Actuellement, j'ai le code suivant Java, qui essaie d'appeler la procédure:

List<Object[]> resultset = hibernateTemplate 
           .findByNamedQuery("inrange", 
            person.getAddress().getLatitude(), 
            person.getAddress().getLongitude()); 

Quand je cours, je reçois l'exception Hibernate suivante:

org.springframework.orm.hibernate3.HibernateSystemException: 
    Named query not known: inrange; 

Je pensais que cela se produit en duo le fait que je ne déclare la procédure stockée dans Mise en veille prolongée. Ma question est:

  • Comment puis-je le déclarer?
  • Existe-t-il un moyen spécial de le déclarer dans le fichier contextuel de l'application Spring?

Répondre

4

Vous pouvez appeler des requêtes SQL natives dans Hibernate.

Regardez ce lien: http://www.mkyong.com/hibernate/how-to-call-store-procedure-in-hibernate/

BTW si vous voulez appeler des procédures stockées, vous pouvez simplement utiliser un ressort JdbcTemplate.

avis qu'une extension de mise en veille prolongée peut répondre à vos besoins: http://www.hibernatespatial.org/

+0

Le Hibernatespatial a l'air très cool, cependant j'utilise mySQL, et il apparaît là que la plupart des fonctionnalités ne sont pas supportées sur ce DB, en particulier la fonction de distance ... – stdcall

+0

En fait chaque DB dispose de ses propres fonctionnalités/fonctions et vous pouvez probablement contribuer à ce projet pour qu'il fonctionne aussi avec mySQL. Bonne chance –

3

Vous confondez les requêtes nommées d'Hibernate avec les procédures stockées de MySQL.

Si vous voulez appeler le proc MySQL stocké, il n'y a aucun avantage à le faire via l'API de Hibernate. Je vous recommande d'utiliser JdbcTemplate de Spring pour effectuer la requête.

Si vous devez absolument utiliser Hibernate, quelque chose comme cela devrait fonctionner:

SQLQuery query = hibernateTemplate.getCurrentSession() 
    .createSQLQuery("SELECT inrange(:latitude, :longitude)"; 
query.setDouble("latitude", ...); 
query.setDouble("longitude", ...); 
List<Object[]> result = query.list(); // requires casting for generics 
+0

Je ne suis pas confus, google un peu et vous trouverez ce que je montre. – stdcall

3

Vous devez ajouter la requête du nom à votre fichier de mappage de mise en veille prolongée. Pouvez-vous partager votre fichier de mappage d'hibernation? Vous pouvez trouver quelques échantillons here. Avec le lien précédent, vous pouvez également passer par this.

Ce sera plus facile si vous pouvez partager le POJO, le mappage d'hibernation et la procédure que vous utilisez.

This blog sera d'aide pour vous. J'espère que vous n'aurez aucun problème avec l'utilisation de la méthode getHibernateTemplate().execute(HibernateCallback).

+0

En fait, je n'ai pas de fichier de mapping Hibernate. J'utilise le contexte XML & Annotations de Spring pour le mappage hibernate. Je peux poster une configuration de ressort si vous le trouvez utile. – stdcall

+0

Pouvez-vous partager la classe POJO? –

+0

Il n'y a pas de pojo, le résultat de la procédure stockée, n'est pas mappé à un pojo, ce sont tous des scalaires. – stdcall

Questions connexes