4.1 Mga parameter para sa mga kahilingan

Hinahayaan ka ng hibernate na ipasa ang mga parameter sa mga query. Kaya, lahat ay gumagana sa mga query at ang database ay lubos na pinasimple.

Napakabihirang makahanap ng mga hindi nababagong query. Sa una, tila kailangan mo lamang ibalik ang isang listahan ng mga kalakal mula sa database. At pagkatapos ay lumalabas na kailangan mo ng up-to-date na listahan ng mga produkto para sa isang partikular na user sa isang partikular na petsa. Pinagbukud-bukod ayon sa kinakailangang field, at hindi pa ang buong listahan, ngunit isang partikular na pahina: halimbawa, mga produkto mula 21 hanggang 30.

At ito mismo ang nalulutas ng mga parameterized na query. Sumulat ka ng isang query sa HQL, at pagkatapos ay palitan mo ang mga halaga na maaaring mabago ng "mga espesyal na pangalan" - mga parameter. At pagkatapos ay hiwalay kapag isinasagawa ang kahilingan, maaari mong ipasa ang mga halaga ng mga parameter na ito.

Sumulat tayo ng HQL query na magbabalik ng lahat ng gawain para sa isang user na may partikular na pangalan:

from EmployeeTask where employee.name = "Ivan Ivanovich"

Ngayon palitan natin ang pangalan ng isang parameter:

from EmployeeTask where employee.name = :username

At ganito ang magiging hitsura ng aming Java code para sa paghahanap ng mga gawain:


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

Gayundin, sa halip na isang pangalan ng parameter, maaari kang gumamit lamang ng isang numero:


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

Bagaman mas mahusay, siyempre, na gamitin ang pangalan - mas madaling basahin at mapanatili ang naturang code.

4.2 setParameterList() na pamamaraan.

Mayroon ding mga kaso kapag ang halaga ng parameter ay hindi isa, ngunit kumakatawan sa isang listahan ng mga bagay. Halimbawa, gusto naming suriin na ang mga propesyon ng mga empleyado ay nakapaloob sa isang tiyak na listahan.

Paano ito magagawa:


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 na uri ng listahan ang maaaring ipasa bilang value ng parameter:

  • hanay ng mga bagay: Bagay[]
  • koleksyon: Koleksyon
  • naka-type na array: T[]
  • naka-type na koleksyon: Collection<T>

Kung magpasya kang magpasa ng isang nai-type na koleksyon o array, kailangan mong ipasa ang uri ng data bilang pangatlong parameter. Halimbawa:


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

Kapag nagtatrabaho sa mga parameter ng listahan, maaari ka ring gumamit ng numero sa halip na pangalan ng parameter. Ngunit muli, ang pangalan ay mas maginhawa.

4.3 Proteksyon laban sa SQL Injection

Ang isa sa pinakamahalagang layunin ng mga parameter ay upang protektahan ang database mula sa mga SQL injection. Maraming mga baguhang programmer, sa halip na gumamit ng mga parameter, ay magkakadikit lamang ng isang string ng ilang bahagi.

Sa halip na magsulat ng ganito:


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

Magsusulat ng ganito:


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

Huwag kailanman gawin iyon!Huwag kailanman pagsamahin ang isang query sa SQL/HQL mula sa maraming bahagi. Dahil maya-maya ay darating sa iyo ang username mula sa kliyente. At ang masamang hacker ay magbibigay sa iyo ng isang string tulad ng""Ivan"; DROP TABLE user;"

At pagkatapos ay ang iyong query sa database ay kukuha ng form:


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

At ito ay mabuti pa rin kung ang iyong data ay tatanggalin lamang. Maaari ka ring sumulat ng ganito:


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

O tulad nito:


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