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 ఇంజెక్షన్ నుండి రక్షణ

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;