1.1 Шиносоӣ бо HQL
Пештар ту бо Hibernate шинос шуда будӣ, ҳоло ман туро бо HQL шинос мекунам, ки ҳамон Hibernate Query Language аст. Ба таври аслӣ, ин SQL аст, ки барои навиштани дархостҳо дар Hibernate таъғир дода шудааст. Дар он якчанд фарқиятҳои асосӣ вуҷуд доранд.
- Истифодаи номи класс ба ҷои номи ҷадвал.
- Истифодаи номи майдони класс ба ҷои номи сутуни ҷадвал.
- Истифодаи ғайриҳатмӣ 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 доранд.
GO TO FULL VERSION