1.1 HQL ilə tanışlıq
Əvvəllər Hibernate ilə tanış oldun, indi isə səni HQL ilə tanış edəcəm, tam adı Hibernate Query Language. Əslində, bu Hibernate-də sorğular yazmaq üçün yenidən işlənmiş SQL-dir. Onun bir neçə əsas fərqi var.
- Cədvəl adının yerinə sinif adı istifadə olunur.
- Cədvəl sütununun adının yerinə sinif sahəsinin adı istifadə olunur.
- Optional olaraq select istifadə olunur.
Hibernate-dən bazasında olan bütün istifadəçiləri qaytarmasını xahiş edək. Bu sorğu belə görünəcək:
from User
Bu hamısıdır, müqayisə üçün SQL-də oxşar bir sorğu göstərəcəm:
select * from user
Burada User
sinif adı, user
isə cədvəl adı.
Tam Java kodu belə olacaq:
public List<User> getAllUsers() {
try (Session session = sessionFactory.openSession()) {
return session.createQuery("from User", User.class).list();
}
}
Ümumilikdə HQL SQL-ə çox oxşayır – onda da operatorlar var:
WHERE
ORDER BY
GROUP BY
HAVING
1.2 HQL ilə iş nümunəsi
Əvvəlki nümunə bəlkə də eyni adlara görə bir az qarışıq gəlir. Gəlin bu məsələdə biraz daha asan olan xüsusi bir nümunə fikirləşək.
Tutaq ki, bizdə user_data adında bir cədvəl var və bu cədvəldə belə sahələr mövcuddur:
- id INT
- user_name VARCHAR(100)
- user_level INT
- user_created DATE
Biz bu cədvəllə əlaqələndirilmiş bir Java sinifi yaradacağıq:
@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;
}
İndi bir neçə nümunə yazacağıq:
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 'test' | select * from user_data where user_name like 'test' |
Sorğular çox oxşardır və siniflərin adları və onların sahələri ilə tanış olduğunda HQL sorğularını oxumaq SQL sorğularını oxumaq qədər asandır. Yazmaq bəlkə də bir az çətindir, amma yenə də, HQL-də çox kompleks sorğular nadir hallarda yazılır.
1.3 select istifadəsi
HQL-də select
istifadə etmək mümkündür, nəticənin məlumat tipi from
-da göstərilən tiplə uyğun gəlmədikdə istifadə olunur.
Məsələn, bütün istifadəçilərin adlarını əldə etmək istəyirik. Onda belə bir sorğu yazmalıyıq:
select name from User
Əlavə olaraq, əgər adlar arasında təkrarlananlar varsa, DISTINCT
operatorundan istifadə edə bilərsən:
select distinct name from User
Alyaslar SQL-də olduğu kimi işləyir:
select distinct u.name from User u where u.created > '2020-01-01'
Tam olaraq Java kod şəklində bu sorğu belə olacaq:
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();
}
}
Diqqət yetir ki, sorğu adların siyahısını qaytarmalıdır. Adlar String tipindədir, ona görə də funksiya tipi və Query sinifinin tip-parametri String tipindədir.
GO TO FULL VERSION