Apa yang dimaksud dengan kueri bernama?
Hibernate memungkinkan Anda untuk mendefinisikan pernyataan kueri dalam bentuk string dalam file pemetaan. Metode kueri ini disebut kueri bernama.
Apa keuntungan menggunakan kueri bernama?
Karena penggunaan HQL Hibernate sering kali memerlukan penulisan pernyataan kueri string dalam kode Java, HQL dicampur antar kode, sehingga merusak keterbacaan kode. Dengan menggunakan kueri bernama, Anda dapat memisahkan logika bisnis dan pernyataan kueri, sehingga Anda dapat fokus pada kueri Kode SQL atau HQL tersebar di seluruh aplikasi.
Kueri bernama dapat digunakan untuk memproses kueri yang kompleks
Bagaimana cara mengimplementasikan kueri bernama?
Memperkenalkan metode berikut:
Metode 1: Deklarasikan pernyataan kueri di bawah tag <class/> di file konfigurasi
Copy kode kodenya sebagai berikut:
<pemetaan hibernasi>
<nama kelas="com.test.bean.Student" table="student" catalog="users">
<nama id="id" type="bilangan bulat">
<nama kolom="id" />
<generator />
</id>
<nama properti="nama" type="string">
<kolom nama="nama" panjang="11" />
</properti>
<nama properti="usia" type="integer">
<nama kolom="umur" />
</properti>
<nama properti="jenis kelamin" type="string">
<nama kolom="jenis kelamin" panjang="2" />
</properti>
</kelas>
<!-- Tentukan pernyataan kueri-->
<nama kueri="findStudentByName">
<![CDATA[dari Siswa dimana nama = :nama]]>
</permintaan>
</hibernasi-pemetaan>
Catatan : Apa maksudnya <![CDATA[ ]]>?
Menunjukkan bahwa ini adalah teks biasa. Tanpa ini, karakter < > & tidak dapat langsung disimpan dalam XML dan perlu di-escape. Namun, dengan tag ini, simbol-simbol ini dapat disimpan dalam dokumen XML tanpa melakukan escape. Hal ini dapat menghindari simbol khusus yang tidak terduga yang menyebabkan kesalahan penguraian XML.
Copy kode kodenya sebagai berikut:
Daftar Publik<Siswa> query(){
Sesi sesi = HibernateSessionFactory.getSession();
Kueri q = session.getNamedQuery("findStudentByName");
q.setString("nama", "zhangsan");
Daftar<Siswa> daftar = q.list();
daftar pengembalian;
}
Metode 2 : Anda juga dapat mendeklarasikan pernyataan kueri dalam tag <class/> di file konfigurasi, tetapi Anda harus menentukannya saat memanggil kode Java (paket + kelas + nama konfigurasi)
Copy kode kodenya sebagai berikut:
<pemetaan hibernasi>
<nama kelas="com.test.bean.Student" table="student" catalog="users">
<nama id="id" type="bilangan bulat">
<nama kolom="id" />
<generator />
</id>
<nama properti="nama" type="string">
<kolom nama="nama" panjang="11" />
</properti>
<nama properti="usia" type="integer">
<nama kolom="umur" />
</properti>
<nama properti="jenis kelamin" type="string">
<nama kolom="jenis kelamin" panjang="2" />
</properti>
<!-- Tentukan pernyataan kueri-->
<nama kueri="findStudentByName">
<![CDATA[dari Siswa dimana nama = :nama]]>
</permintaan>
</kelas>
</hibernasi-pemetaan>
Daftar Publik<Siswa> query(){
Sesi sesi = HibernateSessionFactory.getSession();
Kueri q = session.getNamedQuery("com.test.bean.Student.findStudentByName");
q.setString("nama", "zhangsan");
Daftar<Siswa> daftar = q.list();
daftar pengembalian;
}
Metode ketiga : Gunakan kueri sql asli <sql-query>. Dalam metode ini, semua kolom tabel harus ditulis, jika tidak, kesalahan 'nama kolom tidak valid' akan terjadi kecuali Anda menggunakan skalar kembali untuk mengatur jenis bidang.
Copy kode kodenya sebagai berikut:
<pemetaan hibernasi>
<nama kelas="com.test.bean.Student" table="student" catalog="users">
<nama id="id" type="bilangan bulat">
<nama kolom="id" />
<generator />
</id>
<nama properti="nama" type="string">
<kolom nama="nama" panjang="11" />
</properti>
<nama properti="usia" type="integer">
<nama kolom="umur" />
</properti>
<nama properti="jenis kelamin" type="string">
<nama kolom="jenis kelamin" panjang="2" />
</properti>
</kelas>
<!-- Tentukan pernyataan kueri-->
<sql-query nama="findStudentByName">
<kembalikan alias="s">
</kembali>
<![CDATA[pilih {s.*} dari student s dimana s.name = :name]]>
</sql-kueri>
</hibernasi-pemetaan>
Catatan : Anda juga dapat menggunakan tag <return-property/> di dalam tag <return/> untuk mencantumkan semua bidang tabel. Sama seperti metode yang dijelaskan di atas, semua kolom akan ditanyakan.
Copy kode kodenya sebagai berikut:
Daftar Publik<Siswa> query(){
Sesi sesi = HibernateSessionFactory.getSession();
Kueri q = session.getNamedQuery("findStudentByName");
q.setString("nama", "zhangsan");
Daftar<Siswa> daftar = q.list();
daftar pengembalian;
}
Metode 4 : Gunakan kueri sql asli <sql-query>. Jika Anda menggunakan skalar kembali untuk mengatur jenis bidang, Anda dapat menanyakan beberapa bidang.
Copy kode kodenya sebagai berikut:
<pemetaan hibernasi>
<nama kelas="com.test.bean.Student" table="student" catalog="users">
<nama id="id" type="bilangan bulat">
<nama kolom="id" />
<generator />
</id>
<nama properti="nama" type="string">
<kolom nama="nama" panjang="11" />
</properti>
<nama properti="usia" type="integer">
<nama kolom="umur" />
</properti>
<nama properti="jenis kelamin" type="string">
<nama kolom="jenis kelamin" panjang="2" />
</properti>
</kelas>
<!-- Tentukan pernyataan kueri-->
<sql-query nama="findStudentByName">
<kolom skalar kembali="nama" type="string"/>
<return-scalar kolom="usia" type="integer"/>
<![CDATA[pilih s.name , s.age dari student s dimana s.name = :name]]>
</sql-kueri>
</hibernasi-pemetaan>
Daftar publik<Objek[]> kueri(){
Sesi sesi = HibernateSessionFactory.getSession();
Kueri kueri = session.getNamedQuery("findStudentByName");
query.setString("nama", "zhangsan");
Daftar<Objek[]> daftar = query.list();
daftar pengembalian;
}
atau :
Copy kode kodenya sebagai berikut:
Daftar Publik<Siswa> query(){
Sesi sesi = HibernateSessionFactory.getSession();
Kueri q = sesi.getNamedQuery("findStudentByName").
setResultTransformer(Transformers.aliasToBean(Student.class));
q.setString("nama", "zhangsan");
Daftar<Siswa> daftar = q.list();
daftar pengembalian;
}