1.1 HQL bilan tanishish
Avvalroq Hibernate bilan tanishdingiz, endi men sizni HQL, ya'ni Hibernate Query Language bilan tanishtiraman. Aslida, bu SQL ning Hibernate da so'rovlarni yozish uchun moslashtirilgan versiyasidir. Uning bir necha muhim farqlari bor.
- Jadval nomi o'rniga klass nomidan foydalanish.
- Jadval ustuni nomi o'rniga klass maydon nomidan foydalanish.
- Majburiy emas select dan foydalanish.
Keling, Hibernate dan bazasida mavjud bo'lgan barcha foydalanuvchilarni qaytarib berishini so'raymiz. Ushbu so'rov qanday ko'rinishda bo'ladi:
from User
Bu hammasi, solishtirish uchun SQL da shunga o'xshash so'rov:
select * from user
Bu yerda User – bu klass nomi, va user – bu jadval nomi.
Java kodining to'liq ko'rinishi quyidagicha bo'ladi:
public List<User> getAllUsers() {
try (Session session = sessionFactory.openSession()) {
return session.createQuery("from User", User.class).list();
}
}
Qolgan HQL SQL ga juda o'xshash – unda ham operatorlar mavjud:
WHEREORDER BYGROUP BYHAVING
1.2 HQL bilan ishlash misoli
Ehtimol, avvalgi misol bir oz chalkashtirib qo'ygan bo'lishi mumkin, chunki jadval va maydon nomlari bir xil. Keling, bu masalani osonlashtiradigan maxsus misolni o'ylab topamiz.
Bizda user_data jadvali mavjud, u quyidagi maydonlarni o'z ichiga oladi:
- id INT
- user_name VARCHAR(100)
- user_level INT
- user_created DATE
Biz bu jadvalga mapping qiladigan Java-klass yaratamiz:
@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;
}
Endi bir necha misollar yozamiz:
| 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 'тест' |
So'rovlar juda o'xshash, va agar klass nomlari va ularning maydonlari bilan tanish bo'lsangiz, HQL so'rovlarini o'qish SQL so'rovlarini o'qish kabi osondir. Yozish, ehtimol, biroz qiyinroq bo'lishi mumkin, lekin yana bir bor, HQL da juda murakkab so'rovlar kamdan-kam yoziladi.
1.3 Select dan foydalanish
HQL da select dan foydalanish mumkin, agar natijaning ma'lumot turi from ichida ko'rsatilgan turiga to'g'ri kelmasa.
Masalan, biz user_data jadvalimizdagi barcha foydalanuvchilarning ismlarini olishni istasak, quyidagi so'rovni yozishimiz kerak:
select name from User
Agar ismlar orasida takroriylar bo'lsa, DISTINCT operatoridan foydalanish mumkin:
select distinct name from User
Aliased ham xuddi SQL da ishlaydi:
select distinct u.name from User u where u.created > '2020-01-01'
Albatta, Java kodi ko'rinishida ushbu so'rov quyidagicha bo'ladi:
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();
}
}
Diqqat qiling, so'rov ismlar ro'yxatini qaytarishi kerak. Ismlar String turida, shuning uchun funksiyaning turi va Query klassining tur parametr turi String bo'ladi.
GO TO FULL VERSION