Rumah >Java >javaTutorial >Bagaimana untuk Menukar Hasil Pertanyaan Asli JPA kepada Koleksi POJO dengan Cekap?
Menyelesaikan Penukaran Hasil Pertanyaan Koleksi JPA dengan Kelas POJO
Apabila bekerja dengan JPA, kami sering menghadapi senario di mana pertanyaan asli mengembalikan set hasil dengan berbilang lajur. Menukar set hasil ini kepada koleksi kelas POJO adalah penting untuk memproses data. Dalam artikel ini, kami menyelidiki pendekatan yang berbeza untuk mencapai penukaran ini.
Menggunakan Entiti Dipeta (JPA 2.0 dan ke atas)
JPA 2.0 memperkenalkan keupayaan untuk memetakan pertanyaan asli keputusan kepada kelas entiti JPA. Pendekatan ini mudah dan mudah:
Query query = em.createNativeQuery("SELECT name,age FROM jedi_table", Jedi.class); List<Jedi> items = (List<Jedi>) query.getResultList();
Walau bagaimanapun, pendekatan ini memerlukan Jedi menjadi kelas entiti yang dipetakan, yang mungkin tidak selalunya diingini.
Pemetaan Manual
Untuk senario yang menggunakan entiti dipetakan tidak sesuai, kami boleh menggunakan pemetaan manual. Ini melibatkan mencipta kaedah utiliti untuk memetakan tuple hasil kepada pembina kelas POJO.
public static <T> T map(Class<T> type, Object[] tuple) { Constructor<T> ctor = type.getConstructor(...); // Using reflection to find the constructor return ctor.newInstance(tuple); }
Dengan pemetaan manual, kami boleh menukar senarai tupel kepada koleksi POJO dengan mudah:
Query query = em.createNativeQuery("SELECT name,age FROM jedi_table"); @SuppressWarnings("unchecked") List<Object[]> records = query.getResultList(); List<Jedi> jedis = new LinkedList<>(); for (Object[] record : records) { jedis.add(map(Jedi.class, record)); }
JPA 2.1 dengan @SqlResultSetMapping
JPA 2.1 menyediakan anotasi @SqlResultSetMapping, yang menawarkan cara yang lebih elegan untuk memetakan hasil pertanyaan asli ke kelas POJO. Anotasi ini diisytiharkan dalam entiti:
@SqlResultSetMapping(name="JediResult", classes = { @ConstructorResult(targetClass = Jedi.class, columns = {@ColumnResult(name="name"), @ColumnResult(name="age")}) })
Menggunakan pemetaan ini, kami boleh terus menukar set hasil kepada koleksi POJO:
Query query = em.createNativeQuery("SELECT name,age FROM jedi_table", "JediResult"); @SuppressWarnings("unchecked") List<Jedi> samples = query.getResultList();
Menggunakan Pemetaan XML
Sebagai alternatif, kita boleh mentakrifkan anotasi @SqlResultSetMapping dalam orm.xml, menyimpannya daripada kelas entiti:
<named-native-query name="GetAllJedi" result-set-mapping="JediMapping"> <query>SELECT name,age FROM jedi_table</query> </named-native-query> <sql-result-set-mapping name="JediMapping"> <constructor-result target-class="org.answer.model.Jedi"> <column name="name" class="java.lang.String" /> <column name="age" class="java.lang.Integer" /> </constructor-result> </sql-result-set-mapping>
Menggunakan pemetaan XML ini, kami boleh melakukan penukaran seperti berikut:
Query query = em.createNativeQuery("GetAllJedi"); @SuppressWarnings("unchecked") List<Jedi> samples = query.getResultList();
Setiap pendekatan ini mempunyai kelebihan dan kekurangan sendiri. Memilih kaedah yang betul bergantung pada keperluan khusus dan kekangan aplikasi.
Atas ialah kandungan terperinci Bagaimana untuk Menukar Hasil Pertanyaan Asli JPA kepada Koleksi POJO dengan Cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!