Saya menulis aplikasi web sederhana untuk memanggil prosedur tersimpan dan mengambil beberapa data. Ini adalah aplikasi yang sangat sederhana, yang berinteraksi dengan database klien. Kami memberikan id karyawan dan id perusahaan dan prosedur yang tersimpan akan mengembalikan detail karyawan.
Aplikasi web tidak dapat memperbarui / menghapus data dan menggunakan SQL Server.
Saya menerapkan aplikasi web saya di Jboss AS. Haruskah saya menggunakan JPA untuk mengakses prosedur tersimpan atau CallableStatement
. Keuntungan menggunakan JPA dalam hal ini.
Juga apa yang akan menjadi pernyataan sql untuk memanggil prosedur tersimpan ini. Saya belum pernah menggunakan prosedur tersimpan sebelumnya dan saya berjuang dengan yang satu ini. Google tidak banyak membantu.
Berikut adalah prosedur yang tersimpan:
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
Memperbarui:
Untuk orang lain yang mengalami masalah memanggil prosedur tersimpan menggunakan JPA .
Query query = em.createNativeQuery("{call getEmployeeDetails(?,?)}",
EmployeeDetails.class)
.setParameter(1, employeeId)
.setParameter(2, companyId);
List<EmployeeDetails> result = query.getResultList();
Hal-hal yang saya perhatikan:
- Nama parameter tidak berfungsi untuk saya, jadi coba gunakan indeks parameter.
- Pernyataan sql yang benar,
{call sp_name(?,?)}
bukancall sp_name(?,?)
- Jika prosedur tersimpan mengembalikan set hasil, bahkan jika Anda tahu hanya dengan satu baris,
getSingleResult
tidak akan berfungsi - Berikan
resultSetMapping
nama atau detail kelas hasil
Jawaban:
JPA 2.1 sekarang mendukung Prosedur Tersimpan, baca dokumen Java di sini .
Contoh:
Lihat contoh detailnya di sini .
sumber
Ini tidak benar-benar didukung oleh JPA tetapi dapat dilakukan . Tetap saja saya tidak akan pergi seperti ini:
Oleh karena itu, saya lebih suka mempertimbangkan untuk menggunakan dukungan Spring untuk akses data JDBC , atau pemeta data seperti MyBatis atau, mengingat kesederhanaan aplikasi Anda, JDBC mentah dan
CallableStatement
. Sebenarnya, JDBC mungkin akan menjadi pilihan saya. Berikut adalah contoh awal pembukaan:Referensi
sumber
Anda harus meneruskan parameter ke prosedur tersimpan.
Ini harus bekerja seperti ini:
Memperbarui:
Atau mungkin seharusnya tidak.
Dalam Buku EJB3 Beraksi , disebutkan di halaman 383, bahwa JPA tidak mendukung prosedur tersimpan (halaman hanya pratinjau, Anda tidak mendapatkan teks lengkap, seluruh buku tersedia sebagai unduhan di beberapa tempat termasuk yang ini , Saya tidak tahu apakah ini legal).
Bagaimanapun, teksnya adalah ini:
JPA dan database yang disimpan prosedur
sumber
Cara mengambil parameter keluaran Prosedur Tersimpan menggunakan JPA (2.0 membutuhkan impor EclipseLink dan 2.1 tidak)
Meskipun jawaban ini menguraikan tentang mengembalikan kumpulan data dari prosedur yang tersimpan, saya memposting di sini, karena butuh waktu lama untuk mengetahuinya dan utas ini membantu saya.
Aplikasi saya menggunakan Eclipselink-2.3.1, tetapi saya akan memaksakan peningkatan ke Eclipselink-2.5.0, karena JPA 2.1 memiliki dukungan yang jauh lebih baik untuk prosedur tersimpan.
Menggunakan EclipseLink-2.3.1 / JPA-2.0: Implementasi-Tergantung
Metode ini memerlukan impor kelas EclipseLink dari "org.eclipse.persistence", jadi ini khusus untuk implementasi Eclipselink.
Saya menemukannya di " http://www.yenlo.nl/en/calling-oracle-stored-procedures-from-eclipselink-with-multiple-out-parameters ".
Menggunakan EclipseLink-2.5.0 / JPA-2.1: Implementasi-Independen (sudah didokumentasikan di utas ini)
Metode ini implementasi independen (tidak perlu impor Eclipslink).
sumber
xml
file dan tidak berhasil. Saya tidak bisa membacaOUT
parameter.Untuk prosedur tersimpan sederhana yang menggunakan parameter IN / OUT seperti ini
Anda dapat memanggilnya dari JPA sebagai berikut:
Untuk prosedur tersimpan yang menggunakan
SYS_REFCURSOR
parameter OUT:Anda bisa menyebutnya sebagai berikut:
Untuk fungsi SQL yang terlihat seperti berikut:
Anda bisa menyebutnya seperti ini:
Setidaknya saat menggunakan Hibernate 4.x dan 5.x karena JPA
StoredProcedureQuery
tidak berfungsi untuk SQL FUNCTIONS.Untuk detail lebih lanjut tentang cara memanggil prosedur dan fungsi yang disimpan saat menggunakan JPA dan Hibernate, lihat artikel berikut
sumber
createNativeQuery
. Saya beralih kecreateStoredProcedureQuery
. Kalau begitu, voila!Bagi saya, hanya yang berikut ini yang bekerja dengan Oracle 11g dan Glassfish 2.1 (Toplink):
Varian dengan kawat gigi keriting menghasilkan ORA-00900.
sumber
Jika menggunakan EclipseLink, Anda dapat menggunakan @NamedStoredProcedureQuery atau StoreProcedureCall untuk menjalankan prosedur tersimpan apa pun, termasuk prosedur dengan parameter output, atau kursor keluar. Dukungan untuk fungsi yang disimpan dan tipe data PLSQL juga tersedia.
Lihat, http://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Stored_Procedures
sumber
Pekerjaan berikut untuk saya:
sumber
Mungkin tidak sama untuk Sql Srver tetapi untuk orang yang menggunakan oracle dan eclipslink, ini berfungsi untuk saya
contoh: prosedur yang memiliki satu parameter IN (tipe CHAR) dan dua parameter OUT (NOMOR & VARCHAR)
di persistence.xml nyatakan unit-persistence:
dan mendeklarasikan struktur proc di eclipselink-orm.xml
dalam kode Anda hanya perlu memanggil proc Anda seperti ini:
untuk mendapatkan dua parameter keluaran:
sumber
Ini berhasil untuk saya.
Catatan: di masa mendatang jika Anda memutuskan untuk menggunakan versi default findOne, cukup beri komentar pada anotasi NamedNativeQueries dan JPA akan beralih ke default
sumber
Jawaban ini mungkin berguna jika Anda memiliki manajer entitas
Saya memiliki prosedur tersimpan untuk membuat nomor berikutnya dan di sisi server saya memiliki kerangka kerja jahitan.
Sisi klien
Database Side (SQL server) Saya memiliki prosedur tersimpan bernama
getNextNmber
sumber
Kamu bisa memakai
@Query(value = "{call PROC_TEST()}", nativeQuery = true)
di repositori Anda. Ini berhasil untuk saya.Perhatian: gunakan '{' dan '}' atau tidak akan berhasil.
sumber
JPA 2.0 tidak mendukung nilai RETURN, hanya panggilan.
Solusi saya adalah. Buat FUNCTION memanggil PROCEDURE.
Jadi, di dalam kode JAVA Anda mengeksekusi NATIVE QUERY yang memanggil oracle FUNCTION.
sumber
Untuk memanggil stored procedure kita bisa menggunakan Callable Statement dalam paket java.sql.
sumber
Coba kode ini:
sumber
persistence.xml
codigo java
sumber
Dari JPA 2.1, JPA mendukung untuk memanggil prosedur yang tersimpan menggunakan StoredProcedureQuery dinamis, dan deklaratif @NamedStoredProcedureQuery.
sumber
Solusi saya adalah. Buat FUNCTION memanggil PROCEDURE.
Jadi, di dalam kode JAVA Anda mengeksekusi NATIVE QUERY yang memanggil oracle FUNCTION.
sumber