4.1 Parameter untuk kueri

Hibernasi memungkinkan Anda meneruskan parameter ke kueri. Dengan demikian, semua pekerjaan dengan kueri dan basis data sangat disederhanakan.

Sangat jarang menemukan kueri yang tidak dapat diubah. Pada awalnya, sepertinya Anda hanya perlu mengembalikan daftar barang dari database. Dan ternyata Anda memerlukan daftar produk terkini untuk pengguna tertentu pada tanggal tertentu. Diurutkan berdasarkan bidang yang wajib diisi, dan belum seluruh daftar, tetapi halaman tertentu: misalnya, produk dari 21 hingga 30.

Dan inilah yang dipecahkan oleh kueri berparameter. Anda menulis kueri di HQL, lalu Anda mengganti nilai yang dapat diubah dengan "nama khusus" - parameter. Dan kemudian secara terpisah saat menjalankan permintaan, Anda dapat meneruskan nilai parameter ini.

Mari tulis kueri HQL yang akan mengembalikan semua tugas untuk pengguna dengan nama tertentu:

from EmployeeTask where employee.name = "Ivan Ivanovich"

Sekarang mari kita ganti nama dengan parameter:

from EmployeeTask where employee.name = :username

Dan seperti inilah tampilan kode Java kami untuk menemukan tugas:


String hql = "from EmployeeTask where employee.name = :username";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameter("username", "Ivan Ivanovich");
List<EmployeeTask> resultLIst = query.list();

Selain itu, alih-alih nama parameter, Anda dapat menggunakan angka saja:


String hql = "from EmployeeTask where employee.name = :1";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameter(1, "Ivan Ivanovich");
List<EmployeeTask> resultLIst = query.list();

Meskipun lebih baik, tentu saja, menggunakan nama - jauh lebih mudah untuk membaca dan memelihara kode tersebut.

4.2 metode setParameterList().

Ada juga kasus ketika nilai parameter bukan satu, tetapi mewakili daftar objek. Misalnya, kami ingin memeriksa bahwa profesi karyawan tercantum dalam daftar tertentu.

Bagaimana ini bisa dilakukan:


String hql = "from EmployeeTask where occupation IN (:occupation_list)";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameterList("occupation_list", new String[] {"Programmer", "Tester"});
List<EmployeeTask> resultLIst = query.list();

4 jenis daftar dapat diteruskan sebagai nilai parameter:

  • susunan objek: Objek[]
  • koleksi: Koleksi
  • array yang diketik: T[]
  • koleksi yang diketik: Koleksi<T>

Jika Anda memutuskan untuk meneruskan kumpulan atau larik yang diketik, maka Anda harus meneruskan tipe data sebagai parameter ketiga. Contoh:


String hql = "from EmployeeTask where occupation IN (:occupation_list)";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameterList("occupation_list", new String[] {"Programmer", "Tester"}, String.class);
List<EmployeeTask> resultLIst = query.list();

Saat bekerja dengan parameter daftar, Anda juga dapat menggunakan angka sebagai pengganti nama parameter. Tapi sekali lagi, namanya lebih nyaman.

4.3 Perlindungan terhadap Injeksi SQL

Salah satu tujuan terpenting dari parameter adalah untuk melindungi database dari injeksi SQL. Banyak pemrogram pemula, alih-alih menggunakan parameter, hanya akan merekatkan rangkaian beberapa bagian.

Alih-alih menulis seperti ini:


String hql = "from EmployeeTask where employee.name = :username";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameter("username", "Ivan Ivanovich");
List<EmployeeTask> resultLIst = query.list();

Akan menulis seperti ini:


String hql = "from EmployeeTask where employee.name = " + "Ivan Ivanovich";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
List<EmployeeTask> resultLIst = query.list();

Jangan pernah lakukan itu!Jangan pernah menyatukan kueri SQL/HQL dari berbagai bagian. Karena cepat atau lambat nama pengguna akan datang kepada Anda dari klien. Dan peretas jahat akan memberi Anda string seperti""Ivan"; DROP TABLE user;"

Dan kemudian kueri Anda ke database akan berbentuk:


from EmployeeTask where employee.name = "Ivan"; DROP TABLE user;

Dan masih bagus jika data Anda dihapus begitu saja. Anda juga dapat menulis seperti ini:


from EmployeeTask where employee.name = "Ivan";
UPDATE user SET password = '1' WHERE user.role = 'admin'

Atau seperti ini:


from EmployeeTask where employee.name = "Ivan";
UPDATE user SET role = 'admin' WHERE user.id = 123;