J'écris une application Web simple pour appeler une procédure stockée et récupérer des données. C'est une application très simple, qui interagit avec la base de données du client. Nous transmettons l'identifiant de l'employé et l'identifiant de l'entreprise et la procédure stockée renverra les détails de l'employé.
L'application Web ne peut pas mettre à jour / supprimer les données et utilise SQL Server.
Je déploie mon application Web dans Jboss AS. Dois-je utiliser JPA pour accéder à la procédure stockée ou CallableStatement
. Tout avantage de l'utilisation de JPA dans ce cas.
Quelle sera également l'instruction sql pour appeler cette procédure stockée. Je n'ai jamais utilisé de procédures stockées auparavant et j'ai du mal avec celle-ci. Google n'a pas été d'une grande aide.
Voici la procédure stockée:
CREATE procedure getEmployeeDetails (@employeeId int, @companyId int)
as
begin
select firstName,
lastName,
gender,
address
from employee et
where et.employeeId = @employeeId
and et.companyId = @companyId
end
Mettre à jour:
Pour toute personne ayant des problèmes pour appeler une procédure stockée à l'aide de JPA .
Query query = em.createNativeQuery("{call getEmployeeDetails(?,?)}",
EmployeeDetails.class)
.setParameter(1, employeeId)
.setParameter(2, companyId);
List<EmployeeDetails> result = query.getResultList();
Choses que j'ai remarquées:
- Les noms de paramètres ne fonctionnaient pas pour moi, alors essayez d'utiliser l'index des paramètres.
- Corriger l'instruction SQL
{call sp_name(?,?)}
au lieu decall sp_name(?,?)
- Si la procédure stockée renvoie un jeu de résultats, même si vous savez avec une seule ligne,
getSingleResult
ne fonctionnera pas - Passer un
resultSetMapping
nom ou des détails de classe de résultat
Réponses:
JPA 2.1 prend désormais en charge la procédure stockée, lisez la documentation Java ici .
Exemple:
Voir l'exemple détaillé ici .
la source
Ce n'est pas vraiment pris en charge par JPA mais c'est faisable . Pourtant, je n'irais pas par là:
Je préférerais donc utiliser le support Spring pour l'accès aux données JDBC , ou un mappeur de données comme MyBatis ou, étant donné la simplicité de votre application, JDBC brut et
CallableStatement
. En fait, JDBC serait probablement mon choix. Voici un exemple de lancement de base:Référence
la source
Vous devez transmettre les paramètres à la procédure stockée.
Cela devrait fonctionner comme ceci:
Mettre à jour:
Ou peut-être que ça ne devrait pas.
Dans le livre EJB3 en action , il est dit à la page 383, que JPA ne prend pas en charge les procédures stockées (la page n'est qu'un aperçu, vous n'obtenez pas le texte intégral, le livre entier est disponible en téléchargement à plusieurs endroits dont celui-ci , Je ne sais pas si c'est légal).
Quoi qu'il en soit, le texte est le suivant:
Procédures stockées JPA et base de données
la source
Comment récupérer le paramètre de sortie de procédure stockée à l'aide de JPA (2.0 nécessite des importations EclipseLink et 2.1 pas)
Même si cette réponse élabore sur le retour d'un jeu d'enregistrements à partir d'une procédure stockée, je poste ici, car il m'a fallu des siècles pour le comprendre et ce fil de discussion m'a aidé.
Mon application utilisait Eclipselink-2.3.1, mais je vais forcer une mise à jour vers Eclipselink-2.5.0, car JPA 2.1 a un bien meilleur support pour les procédures stockées.
Utilisation d'EclipseLink-2.3.1 / JPA-2.0: dépendant de l'implémentation
Cette méthode nécessite des importations de classes EclipseLink à partir de "org.eclipse.persistence", elle est donc spécifique à l'implémentation d'Eclipselink.
Je l'ai trouvé sur " http://www.yenlo.nl/en/calling-oracle-stored-procedures-from-eclipselink-with-multiple-out-parameters ".
Utilisation d'EclipseLink-2.5.0 / JPA-2.1: Indépendant de l'implémentation (déjà documenté dans ce fil)
Cette méthode est indépendante de l'implémentation (pas besoin d'importations Eclipslink).
la source
xml
fichier et que cela n'a pas fonctionné. Je ne peux pas lire leOUT
paramètre.Pour une procédure stockée simple qui utilise des paramètres IN / OUT comme celui-ci
Vous pouvez l'appeler depuis JPA comme suit:
Pour une procédure stockée qui utilise un
SYS_REFCURSOR
paramètre OUT:Vous pouvez l'appeler comme suit:
Pour une fonction SQL qui ressemble à ceci:
Vous pouvez l'appeler comme ceci:
Au moins lors de l'utilisation d'Hibernate 4.x et 5.x car le JPA
StoredProcedureQuery
ne fonctionne pas pour les FONCTIONS SQL.Pour plus de détails sur la façon d'appeler des procédures et des fonctions stockées lors de l'utilisation de JPA et Hibernate, consultez les articles suivants
la source
createNativeQuery
. Je suis passé àcreateStoredProcedureQuery
. Alors voilà!Pour moi, seuls les éléments suivants ont fonctionné avec Oracle 11g et Glassfish 2.1 (Toplink):
La variante avec des accolades bouclées a donné ORA-00900.
la source
Si vous utilisez EclipseLink, vous pouvez utiliser @NamedStoredProcedureQuery ou StoreProcedureCall pour exécuter n'importe quelle procédure stockée, y compris celles avec des paramètres de sortie ou des curseurs out. La prise en charge des fonctions stockées et des types de données PLSQL est également disponible.
Voir, http://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Stored_Procedures
la source
Ce qui suit fonctionne pour moi:
la source
Peut-être que ce n'est pas la même chose pour Sql Srver mais pour les personnes utilisant oracle et eclipslink, cela fonctionne pour moi
ex: une procédure qui a un paramètre IN (type CHAR) et deux paramètres OUT (NUMBER & VARCHAR)
dans persistence.xml, déclarez l'unité de persistance:
et déclarez la structure du proc dans le fichier eclipselink-orm.xml
dans le code, il vous suffit d'appeler votre proc comme ceci:
pour obtenir les deux paramètres de sortie:
la source
Cela a fonctionné pour moi.
Remarque: à l'avenir, si vous décidez d'utiliser la version par défaut de findOne, il vous suffit de commenter l'annotation NamedNativeQueries et JPA passera par défaut
la source
Cette réponse peut être utile si vous disposez d'un gestionnaire d'entités
J'avais une procédure stockée pour créer le numéro suivant et du côté serveur, j'ai un cadre de couture.
Côté client
Côté base de données (serveur SQL), j'ai une procédure stockée nommée
getNextNmber
la source
Vous pouvez utiliser
@Query(value = "{call PROC_TEST()}", nativeQuery = true)
dans votre référentiel. Cela a fonctionné pour moi.Attention: utilisez '{' et '}' sinon cela ne fonctionnera pas.
la source
JPA 2.0 ne prend pas en charge les valeurs RETURN, uniquement les appels.
Ma solution était. Créez une FONCTION appelant PROCEDURE.
Ainsi, dans le code JAVA, vous exécutez une requête NATIVE en appelant la fonction oracle.
la source
Pour appeler une procédure stockée, nous pouvons utiliser l'instruction Callable dans le package java.sql.
la source
Essayez ce code:
la source
persistence.xml
codigo java
la source
À partir de JPA 2.1, JPA prend en charge l'appel de procédures stockées à l'aide du StoredProcedureQuery dynamique et du déclaratif @NamedStoredProcedureQuery.
la source
Ma solution était. Créez une FONCTION appelant PROCEDURE.
Ainsi, dans le code JAVA, vous exécutez une requête NATIVE en appelant la fonction oracle.
la source