4.1 கோரிக்கைகளுக்கான அளவுருக்கள்
வினவல்களுக்கு அளவுருக்களை அனுப்ப Hibernate உங்களை அனுமதிக்கிறது. எனவே, வினவல்கள் மற்றும் தரவுத்தளத்துடன் அனைத்து வேலைகளும் பெரிதும் எளிமைப்படுத்தப்படுகின்றன.
மாறாத வினாக்கள் கிடைப்பது மிகவும் அரிது. முதலில், நீங்கள் தரவுத்தளத்திலிருந்து பொருட்களின் பட்டியலைத் திருப்பித் தர வேண்டும் என்று தோன்றுகிறது. ஒரு குறிப்பிட்ட தேதியில் ஒரு குறிப்பிட்ட பயனருக்கான தயாரிப்புகளின் புதுப்பித்த பட்டியல் உங்களுக்குத் தேவை என்று மாறிவிடும். தேவையான புலத்தின்படி வரிசைப்படுத்தப்பட்டது, இன்னும் முழு பட்டியல் இல்லை, ஆனால் ஒரு குறிப்பிட்ட பக்கம்: எடுத்துக்காட்டாக, 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>
தட்டச்சு செய்த சேகரிப்பு அல்லது வரிசையை அனுப்ப முடிவு செய்தால், தரவு வகையை மூன்றாவது அளவுருவாக அனுப்ப வேண்டும். உதாரணமாக:
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 ஊசிக்கு எதிரான பாதுகாப்பு
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;
GO TO FULL VERSION