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
Lepaskan: 2024-12-09 11:13:06
asal
1094 orang telah melayarinya

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();
Salin selepas log masuk

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);
}
Salin selepas log masuk

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));
}
Salin selepas log masuk

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")})
})
Salin selepas log masuk

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();
Salin selepas log masuk

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>
Salin selepas log masuk

Menggunakan pemetaan XML ini, kami boleh melakukan penukaran seperti berikut:

Query query = em.createNativeQuery("GetAllJedi");
@SuppressWarnings("unchecked")
List<Jedi> samples = query.getResultList();
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan