Rumah >Java >javaTutorial >Bagaimana untuk Menukar Hasil Pertanyaan Asli JPA kepada Koleksi POJO dengan Cekap?

Bagaimana untuk Menukar Hasil Pertanyaan Asli JPA kepada Koleksi POJO dengan Cekap?

Linda Hamilton
Linda Hamiltonasal
2024-12-09 11:13:061057semak imbas

How to Efficiently Convert JPA Native Query Results to POJO Collections?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn