JavaRush /Курсхо /All lectures for TG purposes /Омӯзиши навиштани дархостҳо дар HQL

Омӯзиши навиштани дархостҳо дар HQL

All lectures for TG purposes
Сатҳи , Дарс
дастрас

1.1 Шиносоӣ бо HQL

Пештар ту бо Hibernate шинос шуда будӣ, ҳоло ман туро бо HQL шинос мекунам, ки ҳамон Hibernate Query Language аст. Ба таври аслӣ, ин SQL аст, ки барои навиштани дархостҳо дар Hibernate таъғир дода шудааст. Дар он якчанд фарқиятҳои асосӣ вуҷуд доранд.

  1. Истифодаи номи класс ба ҷои номи ҷадвал.
  2. Истифодаи номи майдони класс ба ҷои номи сутуни ҷадвал.
  3. Истифодаи ғайриҳатмӣ of select.

Биёед аз Hibernate пурсем, ки ҳамаи истифодабарандагонро, ки дар база дорад, баргардонад. Ин дархост чунин хоҳад буд:


from User
        

Ва ин ҳама, барои муқоиса, дархости ҳамонанда дар SQL:


select * from user
        

Дар ин ҷо User – номи класс аст, ва user – номи ҷадвал.

Коди пурраи Java чунин менамояд:


public List<User> getAllUsers() {
    try (Session session = sessionFactory.openSession()) {
            return session.createQuery("from User", User.class).list();
    }
}

Дар дигар ҳолатҳо HQL бисёр шабеҳ ба SQL аст – дар он ҳам операторҳо мавҷуданд:

  • WHERE
  • ORDER BY
  • GROUP BY
  • HAVING

1.2 Намунаи кор бо HQL

Мумкин аст, намунаи пешина камтар нофаҳмо буд, зеро номҳои ҷадвалҳо ва майдонҳо якхела буданд. Биёед як мисоли махсус фикр кунем, ки ин мушкиле надошта бошад.

Бигзор мо як ҷадвали user_data дошта бошем, ки дар он чунин майдонҳо мавҷуданд:

  • id INT
  • user_name VARCHAR(100)
  • user_level INT
  • user_created DATE

Мо як класс Java месозем, ки ин ҷадвалро мепайвандад:


@Entity
@Table(name="user_data")
class User {
   @Id
   @GeneratedValue
   public Integer id;
 
   @Column(name="user_name")
   public String name;
 
   @Column(name="user_level")
   public Integer level;
 
   @Column(name="user_created")
   public Date created;
}

Ҳоло якчанд намуна меоравем:

HQL SQL
from User select * from user_data
from User where id=3 select * from user_data where id=3
from User where level in (10,20,30) select * from user_data where user_level IN (10, 20, 30)
from User order by created asc select * from user_data order by user_created asc
from User where name like 'тест' select * from user_data where user_name like 'тест'

Дархостҳо бисёр шабеҳ ҳастанд, ва хондани дархостҳои HQL, вақте ки ту бо номҳои классҳо ва майдонҳои онҳо шинос ҳастӣ, ҳамон қадар осон аст, ки хондани дархостҳои SQL. Навиштан, эҳтимол, каме мушкилтар аст, аммо боз ҳам, дар HQL кам андархостҳои хеле мураккаб навишта мешавад.

1.3 Истифодаи select

Дар HQL мумкин аст select-ро истифода бурд, вақте ки намуди маълумоти натиҷа бо намудаи дар from зикршуда мувофиқат намекунад.

Масалан, мо мехоҳем номҳои ҳамаи истифодабарандагонро, ки дар ҷадвали мо user_data ҳастанд, гирем, пас бояд чунин як дархост навишт:


select name from User
        

Ҳамчунин агар дар номҳо такрорҳо вуҷуд дошта бошанд, пас мумкин аст аз оператори DISTINCT истифода бурд:


select distinct name from User
        

Алиасҳо мисли дар SQL кор мекунанд:


select distinct u.name from User u where u.created > '2020-01-01'

        

Ва пурра дар шакли коди Java ин дархост чунин менамояд:


public List<String> getUserNames() {
    try (Session session = sessionFactory.openSession()) {
            String hql = "select distinct u.name from User u where u.created > '2020-01-01'";
            Query<String> query = session.createQuery(hql , String.class);
            return query.list();
    }
}

Ба назар гир, ки дархост бояд рӯйхати номҳоро баргардонад. Номҳо намудаи String доранд, бинобар ин, ҳам намудаи функсия ва ҳам намуда-параметри класи Query намудаи String доранд.

Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION