Memetakan Permintaan Hibernasi ke Kelas Kustom

1. Ikhtisar

Saat kita menggunakan Hibernate untuk mengambil data dari database, secara default, ia menggunakan data yang diambil untuk membangun seluruh grafik objek untuk objek yang diminta. Tetapi terkadang kita mungkin ingin mengambil hanya sebagian dari data, lebih disukai dalam struktur datar.

Dalam tutorial singkat ini, kita akan melihat bagaimana kita bisa mencapai ini dalam mode Hibernate menggunakan kelas khusus.

2. Entitas

Pertama, mari kita lihat entitas yang akan kita gunakan untuk mengambil data:

@Entity public class DeptEmployee { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private long id; private String employeeNumber; private String designation; private String name; @ManyToOne private Department department; // constructor, getters and setters } @Entity public class Department { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private long id; private String name; @OneToMany(mappedBy="department") private List employees; public Department(String name) { this.name = name; } // getters and setters  }

Di sini, kami memiliki dua entitas - DeptEmployee dan Departemen . Untuk mempermudah, anggaplah seorang DeptEmployee hanya dapat dimiliki oleh satu Departemen.

Tapi, sebuah Departemen bisa memiliki banyak DeptEmployee .

3. Kelas Hasil Kueri Kustom

Katakanlah kita ingin mencetak daftar semua karyawan hanya dengan nama mereka dan nama departemen mereka.

Biasanya, kami akan mengambil data ini dengan kueri seperti ini:

Query query = session.createQuery("from com.baeldung.hibernate.entities.DeptEmployee"); List deptEmployees = query.list();

Ini akan mengambil semua karyawan, semua propertinya, departemen terkait, dan semua propertinya.

Tetapi, dalam kasus khusus ini, ini mungkin agak mahal karena kami hanya memerlukan nama karyawan dan nama departemen.

Salah satu cara untuk hanya mengambil informasi yang kita butuhkan adalah dengan menentukan properti di klausa pemilihan.

Tapi, ketika kita melakukan ini, Hibernate mengembalikan daftar larik alih-alih daftar Objek:

Query query = session.createQuery("select m.name, m.department.name from com.baeldung.hibernate.entities.DeptEmployee m"); List managers = query.list(); Object[] manager = (Object[]) managers.get(0); assertEquals("John Smith", manager[0]); assertEquals("Sales", manager[1]);

Seperti yang bisa kita lihat, data yang dikembalikan agak rumit untuk diproses. Tapi, untungnya, kita bisa mendapatkan Hibernate untuk mengisi data ini ke dalam kelas.

Mari kita lihat kelas Hasil yang akan kita gunakan untuk mengisi data yang diambil menjadi:

public class Result { private String employeeName; private String departmentName; public Result(String employeeName, String departmentName) { this.employeeName = employeeName; this.departmentName = departmentName; } public Result() { } // getters and setters }

Perhatikan bahwa kelas tersebut bukan entitas tetapi hanya POJO. Namun, kita juga dapat menggunakan entitas asalkan memiliki konstruktor yang mengambil semua atribut yang ingin kita isi sebagai parameter.

Kita akan melihat mengapa konstruktor penting di bagian selanjutnya.

4. Menggunakan Konstruktor di HQL

Sekarang, mari kita lihat HQL yang menggunakan kelas ini:

Query query = session.createQuery("select new com.baeldung.hibernate.pojo.Result(m.name, m.department.name)" + " from com.baeldung.hibernate.entities.DeptEmployee m"); List results = query.list(); Result result = results.get(0); assertEquals("John Smith", result.getEmployeeName()); assertEquals("Sales", result.getDepartmentName());

Di sini, kami menggunakan konstruktor yang kami definisikan di kelas Hasil bersama dengan properti yang ingin kami ambil. Ini akan mengembalikan daftar objek Hasil dengan data yang diisi dari kolom.

Seperti yang bisa kita lihat, daftar yang dikembalikan lebih mudah diproses daripada menggunakan daftar array objek.

Penting untuk dicatat bahwa kita harus menggunakan nama kelas yang sepenuhnya memenuhi syarat dalam kueri.

5. Menggunakan ResultTransformer

Alternatif untuk menggunakan konstruktor dalam kueri HQL adalah dengan menggunakan ResultTransformer:

Query query = session.createQuery("select m.name as employeeName, m.department.name as departmentName" + " from com.baeldung.hibernate.entities.DeptEmployee m"); query.setResultTransformer(Transformers.aliasToBean(Result.class)); List results = query.list(); Result result = results.get(0); assertEquals("John Smith", result.getEmployeeName()); assertEquals("Sales", result.getDepartmentName());

Kami menggunakan Transformers. aliasToBean () metode untuk menggunakan data yang diambil untuk mengisi objek Hasil .

Akibatnya, kita harus memastikan nama kolom atau aliasnya dalam pernyataan pilih cocok dengan properti kelas Hasil .

Perhatikan bahwa Query.setResultTransformer ( ResultTransformer ) tidak digunakan lagi sejak Hibernate 5.2.

6. Kesimpulan

Di artikel ini, kami melihat bagaimana kelas kustom dapat digunakan untuk mengambil data dalam bentuk yang mudah dibaca.

Kode sumber yang menyertai artikel ini tersedia di GitHub.