JavaRush /Kurslar /All lectures for AZ purposes /HQL sorğuları yazmağı öyrənirik

HQL sorğuları yazmağı öyrənirik

All lectures for AZ purposes
Səviyyə , Dərs
Mövcuddur

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.

  1. Cədvəl adının yerinə sinif adı istifadə olunur.
  2. Cədvəl sütununun adının yerinə sinif sahəsinin adı istifadə olunur.
  3. 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.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION