Dalam JPA 2.0, kita dapat menggunakan EntityManager.createNativeQuery () untuk menjalankan pernyataan SQL asli. Tetapi ketika hasil kueri kami tidak memiliki kelas entitas yang sesuai, query.getResultList () mengembalikan daftar <objek []>. Dengan kata lain, data setiap baris dikembalikan sebagai array objek.
Penggunaan umum adalah ini:
public void testnativeQuery () {query query = entityManager.createativeQuery ("Pilih id, nama, usia dari t_user"); Daftar baris = query.getResultList (); untuk (baris objek: baris) {objek [] sel = (objek []) baris; System.out.println ("id =" + sel [0]); System.out.println ("name =" + sel [1]); System.out.println ("usia =" + sel [2]); }}Dengan cara ini, itu akan membuat kode sangat sulit untuk dipahami. Apa sebenarnya elemen dengan subskrip 0? Tidak diketahui jika Anda tidak menghitung pernyataan kueri. Selain itu, setelah pernyataan kueri disesuaikan, kode Java juga harus disesuaikan bersama. Pada saat ini, kami berpikir bahwa jika peta dikembalikan, akan jauh lebih jelas untuk digunakan.
Sayangnya, API JPA tidak memberikan pengaturan seperti itu. Faktanya, banyak implementasi JPA yang mendasari mendukung pengembalian objek peta.
Misalnya:
Query.setHint's eclipselink (queryhints.result_type, resultType.map); Hibernate .setresultTransformer (transformers.alias_to_entity_map);
Jadi, jika kita ingin mengembalikan peta dan menentukan bahwa lapisan yang mendasarinya menggunakan implementasi JPA tertentu, kita dapat mengambil langkah berikutnya dan mengorbankan fitur-fitur silang untuk memenuhi kebutuhan kita:
public void testnativeQuery () {query query = entityManager.createativeQuery ("Pilih id, nama, usia dari t_user"); query.unwrap (sqlquery.class) .setresultTransformer (transformers.alias_to_entity_map); Daftar baris = query.getResultList (); untuk (objek obj: baris) {peta row = (peta) obj; System.out.println ("id =" + row.get ("id")); System.out.println ("name =" + row.get ("name")); System.out.println ("Age =" + Row.get ("Age")); }}Kueri mengembalikan metode penulisan dari jenis pengembalian entitas yang ditentukan
Kueri kueri = EntityManager.createNativeQuery ("Pilih ID, Nama, Usia dari T_USER", USER.Class);Perlu dicatat di sini bahwa menggunakan peta jelas kurang efisien daripada menggunakan array objek. Jadi, Anda harus melihat apakah penurunan kinerja berada dalam kisaran yang dapat diterima. Kemudian, di lingkungan hibernate 4.2.x saya, tidak peduli apakah Anda menulis huruf kapital atau huruf kecil di SQL asli Anda, nama lapangan yang dikembalikan dikapitalisasi. Tentu saja, Anda dapat memproses nama -nama bidang dengan cara tertentu dengan menyesuaikan resultStransformer, dan bahkan mengembalikan pojo yang Anda butuhkan.
Metode di atas untuk membiarkan objek peta pengembalian antarmuka kueri JPA adalah semua konten yang saya bagikan dengan Anda. Saya harap Anda dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.