2.1 Panimula sa mga klase ng Query

Siyanga pala, isa pang mahalagang punto ay ang Query helper class. Makikita mo ito sa halimbawang ito:

public List<Employee> getAllEmployes() {
    try (Session session = sessionFactory.openSession()) {
            Query<Employee> query = session.createQuery("from Employee", Employee.class);
            return query.list();
    }
}

Sa katunayan, ang Query ay isang interface at mayroon itong ilang mga pagpapatupad para sa iba't ibang mga kaso. Ngunit para sa pagiging simple, ipagpapatuloy ko itong tawaging isang klase. Ito ay, sabihin nating, isang klase sa malawak na kahulugan - sa mga tuntunin ng OOP.

Tandaan. May dalawang klase noon:

  • Query para ilarawan ang query.
  • TypedQuery upang ilarawan ang isang query na may kilalang uri.

Ang una ay lumitaw noong umiral na ang Hibernate, at wala pang generics. Pagkatapos, pagkatapos ng paglabas ng JDK 5, isa pang klase ang idinagdag sa Hibernate - TypedQuery, na suportado na ang pag-type ng resulta ng query.

Ngunit, sa pagkakatanda ko, simula sa ika-5 bersyon ng Hibernate, isang klase na lang ang natitira, at ito ay tinatawag na Query.

Ang karaniwang paraan upang lumikha ng isang Query ay:


Query<Employee> query = session.createQuery("from Employee", Employee.class);

Natutunan mo kung paano lumikha ng mga object ng Query, ngunit paano mo isasagawa ang mga query na ito?

Ito ay mas simple dito - tinatawag lang namin ang list() na pamamaraan sa Query object:


Query<Employee> query = session.createQuery("from Employee", Employee.class);
List<Employee> resultLіst = query.list();

Ang list() method ay may kasingkahulugan ng JPA, isang paraan na gumagawa ng parehong bagay ngunit tinatawag na getResultList() . Minsan makikita mo ito sa code na isinulat ng ibang mga programmer.

Sa pamamagitan ng paraan, kung ang query ay nagpapahiwatig na ang resulta ay nasa isang resulta, kung gayon mas madaling gamitin ang uniqueResult() na paraan upang tawagan ang query .


Query<Employee> query = session.createQuery("from Employee where id = 1", Employee.class);
Employee result = query.uniqueResult();

Ang uniqueResult() method ay may JPA synonym, ang singleResult() method . Ipinakilala ito para sa pagiging tugma ng Hibernate sa pamantayan ng JPA. Siya ay eksaktong parehong bagay.

2.2 Paraan ng klase ng pagtatanong

Sa katunayan, ang klase ng Query ay may maraming iba't ibang mga pamamaraan. Sa ibaba ay pag-uusapan ko ang tungkol sa tatlo pa sa kanila.

Ang una ay ang stream() method . At ang kasingkahulugan nitong JPA getResultStream() .

Ang parehong mga paraang ito ay nagbabalik ng stream ng data sa halip na isang listahan. Ang diskarte na ito ay maaaring maging napakahusay kapag hindi mo kailangan ang lahat ng mga bagay na nakuha bilang resulta ng isang query nang sabay-sabay. O may posibilidad na ang una lang sa kanila ang gagamitin.

Halimbawa:


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
Stream<Employee> stream = query.stream();

Ang pangalawang paraan ay ang executeUpdate() na pamamaraan . Maaari kang magsulat ng isang query na magbabago ng isang bagay sa database. Sa kasong ito, kinakailangan na ang Hibernate ay hindi gumamit ng read-only na transaksyon kapag ina-access ang database.

Halimbawa ng kahilingan: nagpasya kaming itaas ang antas ng lahat ng user ng 1.


Query<User> query = session.createQuery("update User set level=level+1", User.class);
int count = query.executeUpdate();

Ibabalik ng executeUpdate() na paraan ang bilang ng mga row na aktwal na nabago.

At sa wakas ang pangatlong paraan ay scroll() . Sasabihin namin sa iyo ng kaunti pa tungkol dito.

2.3 Mag-scroll sa mga pamamaraan ng klase

Ang pamamaraang ito ay medyo katulad ng stream() na pamamaraan . Ito lamang ang nagpapahintulot sa iyo na lumipat sa listahan ng mga resulta nang hindi hinuhugot ang mga resulta. Iyon ay, maaari kang magsagawa ng query, pagkatapos ay i-scroll ito sa ika-milyong linya ng resulta at simulang magbasa ng data mula doon.

Tulad ng isang advanced na iterator.


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();

Ang bagay na ScrollableResults ay may mga sumusunod na pamamaraan:

Pamamaraan Paglalarawan
R get() Ibinabalik ang kasalukuyang elemento
susunod() Inilipat ang pointer sa susunod na elemento
nakaraan() Inilipat ang pointer sa nakaraang elemento
scroll(int size) Mag-scroll pasulong ayon sa mga linya ng laki
posisyon(int pos) Ginagawang elemento ng pos number ang kasalukuyang elemento
huling() Ang kasalukuyang elemento ngayon ang huli
una() Ang kasalukuyang elemento ay ngayon ang una
getRowNumber() Ibinabalik ang kasalukuyang numero ng linya
setRowNumber() Itinatakda ang kasalukuyang numero ng linya

Sabihin nating nagpatakbo ka ng query at gusto mong makuha ang huling elemento. Narito kung paano ito gawin:


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();
scroll.last();
Employee lastEmployee = scroll.get();