Ich schreibe eine einfache Webanwendung, um eine gespeicherte Prozedur aufzurufen und einige Daten abzurufen. Es ist eine sehr einfache Anwendung, die mit der Datenbank des Kunden interagiert. Wir übergeben die Mitarbeiter- und Firmen-ID und die gespeicherte Prozedur gibt die Mitarbeiterdaten zurück.
Die Webanwendung kann keine Daten aktualisieren / löschen und verwendet SQL Server.
Ich stelle meine Webanwendung in Jboss AS bereit. Soll ich JPA verwenden, um auf die gespeicherte Prozedur zuzugreifen oder CallableStatement
. Jeder Vorteil der Verwendung von JPA in diesem Fall.
Wie lautet auch die SQL-Anweisung zum Aufrufen dieser gespeicherten Prozedur? Ich habe noch nie gespeicherte Prozeduren verwendet und habe Probleme mit dieser. Google war keine große Hilfe.
Hier ist die gespeicherte Prozedur:
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
Aktualisieren:
Für alle anderen, die Probleme beim Aufrufen der gespeicherten Prozedur mit JPA haben .
Query query = em.createNativeQuery("{call getEmployeeDetails(?,?)}",
EmployeeDetails.class)
.setParameter(1, employeeId)
.setParameter(2, companyId);
List<EmployeeDetails> result = query.getResultList();
Dinge, die mir aufgefallen sind:
- Parameternamen haben bei mir nicht funktioniert, versuchen Sie also, den Parameterindex zu verwenden.
- Korrigieren Sie die SQL-Anweisung
{call sp_name(?,?)}
anstelle voncall sp_name(?,?)
- Wenn die gespeicherte Prozedur eine Ergebnismenge
getSingleResult
zurückgibt, funktioniert dies nicht , selbst wenn Sie nur eine Zeile kennen - Übergeben Sie einen
resultSetMapping
Namen oder Details zur Ergebnisklasse
Antworten:
JPA 2.1 unterstützt jetzt gespeicherte Prozeduren. Lesen Sie das Java-Dokument hier .
Beispiel:
Siehe detailliertes Beispiel hier .
quelle
Es wird von JPA nicht wirklich unterstützt, ist aber machbar . Trotzdem würde ich diesen Weg nicht gehen:
Ich würde daher lieber die Unterstützung von Spring für den JDBC-Datenzugriff oder einen Daten-Mapper wie MyBatis oder, angesichts der Einfachheit Ihrer Anwendung, Raw-JDBC und verwenden
CallableStatement
. Eigentlich wäre JDBC wahrscheinlich meine Wahl. Hier ist ein einfaches Kickoff-Beispiel:Referenz
quelle
Sie müssen die Parameter an die gespeicherte Prozedur übergeben.
Es sollte so funktionieren:
Aktualisieren:
Oder vielleicht sollte es nicht.
Im Buch EJB3 in Aktion heißt es auf Seite 383, dass JPA gespeicherte Prozeduren nicht unterstützt (Seite ist nur eine Vorschau, Sie erhalten nicht den vollständigen Text, das gesamte Buch steht an mehreren Stellen als Download zur Verfügung, einschließlich dieser Ich weiß aber nicht, ob das legal ist.
Wie auch immer, der Text lautet wie folgt:
Gespeicherte JPA- und Datenbankprozeduren
quelle
So rufen Sie den Ausgabeparameter für gespeicherte Prozeduren mit JPA ab (2.0 erfordert EclipseLink-Importe und 2.1 nicht)
Obwohl diese Antwort die Rückgabe eines Recordset von einer gespeicherten Prozedur ausführlich beschreibt, poste ich hier, da ich ewig gebraucht habe, um es herauszufinden, und dieser Thread mir geholfen hat.
Meine Anwendung verwendete Eclipselink-2.3.1, aber ich werde ein Upgrade auf Eclipselink-2.5.0 erzwingen, da JPA 2.1 gespeicherte Prozeduren viel besser unterstützt.
Verwenden von EclipseLink-2.3.1 / JPA-2.0: Implementierungsabhängig
Diese Methode erfordert den Import von EclipseLink-Klassen aus "org.eclipse.persistence" und ist daher spezifisch für die Eclipselink-Implementierung.
Ich fand es unter " http://www.yenlo.nl/en/calling-oracle-stored-procedures-from-eclipselink-with-multiple-out-parameters ".
Verwenden von EclipseLink-2.5.0 / JPA-2.1: Implementierungsunabhängig (bereits in diesem Thread dokumentiert)
Diese Methode ist implementierungsunabhängig (keine Eclipslink-Importe erforderlich).
quelle
xml
Datei definiert wurde und nicht funktioniert hat. Ich kann denOUT
Parameter nicht lesen .Bei Oracle 11g und Glassfish 2.1 (Toplink) funktionierte nur Folgendes:
Die Variante mit geschweiften Klammern ergab ORA-00900.
quelle
Wenn Sie EclipseLink verwenden, können Sie mit @NamedStoredProcedureQuery oder StoreProcedureCall alle gespeicherten Prozeduren ausführen, einschließlich solcher mit Ausgabeparametern oder Out-Cursorn. Unterstützung für gespeicherte Funktionen und PLSQL-Datentypen ist ebenfalls verfügbar.
Siehe http://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Stored_Procedures
quelle
Für eine einfache gespeicherte Prozedur, die solche IN / OUT-Parameter verwendet
Sie können es von JPA wie folgt aufrufen:
Für eine gespeicherte Prozedur, die einen
SYS_REFCURSOR
OUT-Parameter verwendet:Sie können es wie folgt nennen:
Für eine SQL-Funktion, die wie folgt aussieht:
Sie können es so nennen:
Zumindest bei Verwendung von Hibernate 4.x und 5.x, da der JPA
StoredProcedureQuery
für SQL-FUNKTIONEN nicht funktioniert.Weitere Informationen zum Aufrufen gespeicherter Prozeduren und Funktionen bei Verwendung von JPA und Hibernate finden Sie in den folgenden Artikeln
quelle
createNativeQuery
. Ich wechselte zucreateStoredProcedureQuery
. Dann voila!Folgendes funktioniert für mich:
quelle
Vielleicht ist es nicht dasselbe für SQL Srver, aber für Leute, die Orakel und Eclipslink verwenden, funktioniert es für mich
Beispiel: Eine Prozedur mit einem IN-Parameter (Typ CHAR) und zwei OUT-Parametern (NUMBER & VARCHAR).
deklarieren Sie in der Datei persistence.xml die Persistenz-Einheit:
und deklarieren Sie die Struktur des Prozesses in der Datei eclipselink-orm.xml
Im Code müssen Sie Ihren Proc nur so aufrufen:
So erhalten Sie die beiden Ausgabeparameter:
quelle
Das hat bei mir funktioniert.
Hinweis: Wenn Sie sich in Zukunft für die Verwendung der Standardversion von findOne entscheiden, kommentieren Sie einfach die Annotation NamedNativeQueries, und JPA wechselt zur Standardversion
quelle
Diese Antwort kann hilfreich sein, wenn Sie einen Entitätsmanager haben
Ich hatte eine gespeicherte Prozedur, um die nächste Nummer zu erstellen, und auf der Serverseite habe ich ein Naht-Framework.
Client-Seite
Datenbankseite (SQL Server) Ich habe die Prozedur mit dem Namen gespeichert
getNextNmber
quelle
JPA 2.0 unterstützt keine RETURN-Werte, sondern nur Aufrufe.
Meine Lösung war. Erstellen Sie eine FUNKTION, die PROCEDURE aufruft.
Im JAVA-Code führen Sie also eine NATIVE QUERY aus, die das Orakel FUNCTION aufruft.
quelle
Um die gespeicherte Prozedur aufzurufen, können wir die Callable-Anweisung im Paket java.sql verwenden.
quelle
Versuchen Sie diesen Code:
quelle
Sie können
@Query(value = "{call PROC_TEST()}", nativeQuery = true)
in Ihrem Repository verwenden. Das hat bei mir funktioniert.Achtung: benutze '{' und '}' oder es wird nicht funktionieren.
quelle
persistence.xml
Codigo Java
quelle
Ab JPA 2.1 unterstützt JPA das Aufrufen gespeicherter Prozeduren mithilfe der dynamischen StoredProcedureQuery und der deklarativen @NamedStoredProcedureQuery.
quelle
Meine Lösung war. Erstellen Sie eine FUNKTION, die PROCEDURE aufruft.
Im JAVA-Code führen Sie also eine NATIVE QUERY aus, die das Orakel FUNCTION aufruft.
quelle