4.1 विनंत्यांसाठी पॅरामीटर्स

हायबरनेट तुम्हाला क्वेरींमध्ये पॅरामीटर्स पास करण्याची परवानगी देते. अशा प्रकारे, सर्व प्रश्नांसह कार्य आणि डेटाबेस मोठ्या प्रमाणात सरलीकृत आहे.

अपरिवर्तनीय प्रश्न शोधणे अत्यंत दुर्मिळ आहे. सुरुवातीला, असे दिसते की आपल्याला फक्त डेटाबेसमधून वस्तूंची यादी परत करणे आवश्यक आहे. आणि मग असे दिसून आले की आपल्याला विशिष्ट तारखेला विशिष्ट वापरकर्त्यासाठी उत्पादनांची अद्ययावत सूची आवश्यक आहे. आवश्यक फील्डनुसार क्रमवारी लावलेले, आणि अद्याप संपूर्ण यादी नाही, परंतु एक विशिष्ट पृष्ठ: उदाहरणार्थ, 21 ते 30 पर्यंतची उत्पादने.

आणि हेच पॅरामीटराइज्ड प्रश्न सोडवतात. तुम्ही HQL मध्ये एक क्वेरी लिहा आणि नंतर तुम्ही "विशेष नावे" - पॅरामीटर्ससह बदलता येणारी मूल्ये बदलता. आणि नंतर विनंती अंमलात आणताना स्वतंत्रपणे, आपण या पॅरामीटर्सची मूल्ये पास करू शकता.

चला एक HQL क्वेरी लिहू जी विशिष्ट नाव असलेल्या वापरकर्त्यासाठी सर्व कार्ये परत करेल:

from EmployeeTask where employee.name = "Ivan Ivanovich"

आता पॅरामीटरने नाव बदलू:

from EmployeeTask where employee.name = :username

आणि कार्य शोधण्यासाठी आमचा जावा कोड असा दिसेल:


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();

तसेच, पॅरामीटर नावाऐवजी, तुम्ही फक्त एक संख्या वापरू शकता:


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();

जरी, अर्थातच, नाव वापरणे चांगले असले तरी - असा कोड वाचणे आणि राखणे खूप सोपे आहे.

4.2 setParameterList() पद्धत.

अशी प्रकरणे देखील आहेत जेव्हा पॅरामीटर मूल्य एक नसते, परंतु वस्तूंची सूची दर्शवते. उदाहरणार्थ, आम्ही तपासू इच्छितो की कर्मचार्‍यांचे व्यवसाय एका विशिष्ट सूचीमध्ये आहेत.

हे कसे केले जाऊ शकते:


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 प्रकारची यादी पास केली जाऊ शकते:

  • ऑब्जेक्ट्सचे अॅरे: ऑब्जेक्ट[]
  • संग्रह: संग्रह
  • टाइप केलेला अॅरे: T[]
  • टाइप केलेला संग्रह: संग्रह<T>

तुम्ही टाइप केलेला संग्रह किंवा अॅरे पास करण्याचे ठरवल्यास, तुम्हाला डेटा प्रकार तिसरा पॅरामीटर म्हणून पास करणे आवश्यक आहे. उदाहरण:


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();

सूची पॅरामीटर्ससह कार्य करताना, तुम्ही पॅरामीटर नावाऐवजी संख्या देखील वापरू शकता. पण पुन्हा, नाव अधिक सोयीस्कर आहे.

4.3 SQL इंजेक्शनपासून संरक्षण

एसक्यूएल इंजेक्शन्सपासून डेटाबेसचे संरक्षण करणे हे पॅरामीटर्सच्या सर्वात महत्वाच्या उद्देशांपैकी एक आहे. बरेच नवशिक्या प्रोग्रामर, पॅरामीटर्स वापरण्याऐवजी, अनेक भागांची स्ट्रिंग एकत्र चिकटवतात.

असे लिहिण्याऐवजी:


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();

असे लिहू:


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

असे कधीही करू नका!एकाधिक भागांमधून कधीही SQL/HQL क्वेरी एकत्र चिकटवू नका. कारण लवकरच किंवा नंतर वापरकर्तानाव क्लायंटकडून तुमच्याकडे येईल. आणि दुष्ट हॅकर तुम्हाला एक स्ट्रिंग देईल""Ivan"; DROP TABLE user;"

आणि नंतर डेटाबेसमध्ये तुमची क्वेरी फॉर्म घेईल:


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

आणि जर तुमचा डेटा फक्त हटवला गेला तर ते चांगले आहे. आपण असे देखील लिहू शकता:


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

किंवा यासारखे:


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