JavaRush /Kurslar /All lectures for UZ purposes /HQL so'rovlarini yozishni o'rganamiz

HQL so'rovlarini yozishni o'rganamiz

All lectures for UZ purposes
Daraja, Dars
Mavjud

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.

  1. Jadval nomi o'rniga klass nomidan foydalanish.
  2. Jadval ustuni nomi o'rniga klass maydon nomidan foydalanish.
  3. 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:

  • WHERE
  • ORDER BY
  • GROUP BY
  • HAVING

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.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION