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.
de quelle façon le sp renvoie la valeur scalaire? paramètre de sortie, SELECT @R ou RETURN @R? – MtwStark
Il utilise RETURN @R. – fhossfel