2017-10-15 9 views
0

Si vous avez une fonction stockée qui fait des choses à l'intérieur de la base de données et renvoie un scalaire (disons, une clé générée). Je l'ai défini comme NamedStoredProcedureQuery:Comment obtenir un résultat scalaire à partir de @NamedStoredProcedureQuery?

@NamedStoredProcedureQuery(name="do_something", 
          procedureName = "dbo.do_something", 
          parameters = { 
           @StoredProcedureParameter(mode = ParameterMode.IN, type = Integer.class, name = "param") 
             } 
) 

j'appelle la fonction à l'aide du gestionnaire d'entités:

Query doSomethingQuery = em.createNamedStoredProcedureQuery("do_something"); 
doSomething.setParameter("param", 1); 
Object result = doSomething.getSingleResult(); 

La fonction stockée est appelée, mais il semble que mon fournisseur JPA, Hibernate, ne sait pas que ce devrait s'attendre à un résultat à retourner. Le SQL généré ressemble à ceci:

12:10:34,960 INFO SchemaCreatorImpl:489 - HHH000476: Executing import script 'org.hiber[email protected]30135202' 
Hibernate: 
    {call dbo.do_something(?,?,?,?)} 
12:10:35,251 TRACE BasicBinder:95 - binding parameter [param] as [INTEGER] - [1] 

Maintenant le problème est assez évident. L'instruction d'appel ne fournit pas de variable de liaison pour la valeur de retour. À mon humble avis, il devrait être {? = call dbo.do_something(?)}.

J'ai essayé d'ajouter returnsResultSet=true à NamedStoredProcedureQuery mais Hibernate 5.2.10.Final ne semble pas avoir implémenté cela - même si Hibernate prétend être compatible avec JPA 2.1. Une autre tentative a été d'ajouter resultClass = Integer.class mais cela a échoué aussi. Il semble que la classe resultClass doit être une entité. Cela ne marchera pas pour un scalaire.

+0

de quelle façon le sp renvoie la valeur scalaire? paramètre de sortie, SELECT @R ou RETURN @R? – MtwStark

+0

Il utilise RETURN @R. – fhossfel

Répondre

1

« La procédure/fonction stockée doit retourner un ResultSet comme le premier hors-paramètre pour être en mesure de travailler avec Hibernate »

Voir 16.2.2. Using stored procedures for querying pour référence

essayer d'utiliser

SELECT @R 

au lieu de

RETURN @R 

Vous pouvez également essayer d'ajouter le SELECT avant le retour (pour votre code existant)

+0

Merci d'avoir signalé la section dans la documentation. Je suppose que c'est la bonne réponse, mais je crains de ne pas pouvoir changer la signature de la procédure car elle est hélas utilisée par les anciens codes. Je vais probablement devoir travailler avec un wrapper. Je vais déposer un CR afin que cette fonctionnalité puisse être ajoutée à Hibernate. – fhossfel

+0

il suffit d'ajouter SELECT avant le retour, cela devrait fonctionner avec le code existant – MtwStark