HQL Nedir? Temel HQL Bilgileri

HQL(Hibernate Query Language), Hibernate’de kullanilan son derece güçlü nesneye yönelik (Object-Oriented) bir sorgulama dilidir. Söz dizimi olarak Sql’e çok benzer, Sql’den temel farki, tablo ve sütunlarin yerine siniflar ve özellikleri kullanmasidir. Sql (Structured Query Language) veri tabani nesneleri ile birlikte çalisirken, Hql sinif ve nesnelerle birlikte çalisir.

Hql, iliskisel nesne modellerini esas alir. Hql Polymorphism ve Associations’i destekler. Hql, Hibernate araciligi ile otomatik olarak sql sorgusu olusturur ve geri planda, veritabaninda bunlari uygular.

Hql kullanirken ayni zamanda, Criteria API ve Native SQL sorgulari kullanarak QBC (Query By Criteria) , QBE (Query BY Example) ‘da kullanilabilir.
Hql’de sinif isimleri hariç, büyük-küçük harf duyarliligi yoktur, yani terimleri nasil yazdigimizin önemi yoktur. Ama nesneler ile ilgili tanimlamalar oldugu gibi kullanilmak zorundadir.

Neden Hql

  • Relational Islemleri Destekler: Hql objeler üzerinde sql sorgulari yazmaya izin verir, tablo ve sütunlarin yerine siniflar ve özellikleri kullanir.
  • Sorgu sonuçlari Obje Olarak Döner: HQL sorgu sonuçlarini, kullanimi kolay olan nesne seklinde döndürür.
  • Polimorfik Sorgulari Destekler: HQL,Polimorfik Sorgulari destekler. Sorgu sonucunda, tüm alt nesneleri de birlikte döndürür.
  • Kullanim Kolaydir: Hql kullanim olarak Sql’e çok benzer, bu da alisilagelmis kullanim ve ögrenme kolayligi getirir. Ayrica Aggregation (max, avg), Ordering, Sub queries, Inner/outer/full joins, pagination gibi pek çok özelligi destekler.
  • Veritabani Bagimsizdir: (Kullanilan veritabani temel özelligi destekliyorsa) HQL’de yazilmis sorgular veritabani bagimsizdir.

 

Parametre Kullanma

Hql ‘de sorgumuza disaridan parametre gönderebiliriz. Bu sirada,özellikle kullanicilardan gelecek parametreler için, SQL injection sorununu düsünmemize gerek yoktur. Hql bu kontrolleri kendi içinde yapar.

Sorguya disaridan bir parametre gönderildiginde, gönderilen parametre “:” simgesinden sonra kullanilir. Sorgumuza parametre gönderen basit bir örnek:

String hql = "FROM URUNLER WHERE ID = :urun_Id";
Query query = session.createQuery(hql);
query.setParameter("urun_Id",10);
List results = query.list();

 

AS Ifadesi (Alias)

As ifadesi, tipki Sql de oldugu gibi, Nesneleri özel olarak adlandirmak için kullanilir. As ifadesi opsiyoneldir. Istenirse nesne adindan sonra dogrudan takma (alias) ad da kullanilabilir.

String hql = "FROM URUNLER AS A";
String hql = "FROM URUNLER A";

Ayni anda iki objeden de sorgulama yapabilir ve bunlari alias olarak kullanabiliriz.

Örnek olarak:

String hql = "FROM URUNLER AS A, URUN_TEDARIKCI AS B";
String hql = "FROM URUNLER A, URUN_TEDARIKCI B";

 

Select Ifadesi

HQL Nesneye yönelik sorgulama yapar demistik. Eger nitelik degil de nesne getirmek istersek “select” ifadesini kullanmamiz gerekmez. Ama eger sorgu sonucunda dönen degerimiz özel olarak belirtilen bir veya birkaç alan ise “Select” ifadesini kullanmak zorundayiz. Örnek olarak URUNLER nesnemizdeki tüm verileri sorgulamak için:

String hql = "FROM URUNLER";

Yazmamiz yeterlidir. Ama sadece UrunAdi alanini sorgulayacaksak:

String hql = "SELECT UrunAdi FROM URUNLER";

Yazmamiz gerekir. Burada dikkat etmemiz gereken, UrunAdi alani, tablodaki bir alan degildir. URUNLER nesnesinin bir özelligidir.

Where Ifadesi

Sorgularimizda, veritabanindan dönen sonuçlari, kosullara göre, sinirlandirmak istedigimizde "Where" ifadesini kullaniriz. Örnek olarak:

String hql = "FROM URUNLER WHERE ID = 10"; 
Query query = session.createQuery(hql); 
List results = query.list();

 

Join Ifadesi

SQL bulunan inner join, left outer join ve right outer join yapilari HQL’de kullanilabilir. Örnek olarak:

String hql = "FROM URUNLER LEFT OUTER JOIN URUN_TEDARIKCI";
Query query = session.createQuery(hql);
List results = query.list();

 

Order By Ifadesi

Hql,  sorgumuzun sonucunda dönen degerleri siralayabilmemize olanak saglar. Bunun içinde Sql’deki gibi Order by ifadesini kullaniriz. Artan veya azalan sirada oldugunu belirtmek için de ASC ve DESC ifadeleri kullanilir. Örnek olarak:

String hql = "FROM URUNLER ORDER BY UrunFiyat DESC";
Query query = session.createQuery(hql);
List results = query.list();

Iki veya daha fazla degere göre siralama yapmak için ”,” ile ayirmak yeterlidir. Örnek olarak:

String hql = "FROM URUNLER ORDER BY UrunFiyat DESC, UrunAdi DESC";
Query query = session.createQuery(hql);
List results = query.list();

 

Group By Ifadesi

Group By ifadesi tipki Sql de oldugu gibi, sorgu sonucunda dönen degerleri gruplamamizi saglar. Group By ifadesi kullanilarak olusturulabilecek basit bir cümle örnegi:

String hql ="SELECT SUM(UrunFiyat), UrunAdi FROM URUNLER GROUP BY UrunAdi";
Query query = session.createQuery(hql);
List results = query.list();

 

Like Ifadesi

Like ifadesi de tipki Sql de oldugu gibidir Basit bir örnek:

String hql =" FROM URUNLER WHERE UrunAdi LIKE '%ab%' ";
Query query = session.createQuery(hql);
List results = query.list();

 

Toplama Methotlari

HQL, SQL için kullanilan pek çok toplama methotunu destekler.  Bunlar SQL ile ayni mantikta çalisir. HQL in destekledigi toplama methotlari sunlardir:

  • avg(property name) : Belirtilen alanin degerlerinin ortalamasini döndürür.
  • count(property name or *): Belirtilen alanin degerlerinin adedini döndürür.
  • max(property name) : Belirtilen alanin degerlerinin en büyügünü döndürür.
  • min(property name) : Belirtilen alanin degerlerinin en küçügünü döndürür.
  • sum(property name) : Belirtilen alanin degerlerinin toplamini döndürür .

Not: Burada  “Distinct” ifadesi de kullanilabilir. Mesela sorgumuzda, ayni ada sahip ürünleri tek ürün olarak kabul ederek, toplam ürün çesidimizi bulmaya çalisalim:

String hql = "SELECT count(distinct UrunAdi) FROM URUNLER";
Query query = session.createQuery(hql);
List results = query.list();

 

Sorgu Sonucunda Dönen Satir Sayisi (Pagination)

Hql ‘de, sorgu sonucunda dönecek olan satirlari belirlemek için kullanilan 2 yöntem vardir.

Query setFirstResult(int startPosition) : Bu methot, aldigi integer sayi ile listemize eklemeye baslayacagimiz ilk degeri belirleriz.
Query setMaxResults(int maxResult):  Bu methot, sorgu sonucunda dönecek satirlarin maksimum sayisini belirler.

Bu iki methotu sayfalama yapisinda da kullanabiliriz. Mesela Sorgumuzun ilk 10 kaydini getirelim:

String hql = "FROM URUNLER";
Query query = session.createQuery(hql);
query.setFirstResult(1);
query.setMaxResults(10);
List results1 = query.list();

Ikinci 10 kayit için:

String hql = "FROM URUNLER";
Query query = session.createQuery(hql);
query.setFirstResult(11);
query.setMaxResults(10);
List results2 = query.list();

 

HQL Select Query Örnegi

Query query = session.createQuery("from URUNLER where ID = :urun_Id ");
query.setParameter("urun_Id", 10);
List list = query.list();
Query query = session.createQuery("from URUNLER where  ID=10 ");
List list = query.list();

HQL sorgularinda, veritabaninda bulunan tablolar degil, persistent object leri kullanildigi için, nesnenin adi yerine paketadi+sinifadi seklinde de kullanilabilir. Örnek olarak:

Query query = session.createQuery("from com.hibernate.URUNLER where  ID=10 ");
List list = query.list();

 

HQL Insert Query Örnegi

SQL de olan INSERT INTO … VALUES. Seklinde kullanim HQL de yoktur. Fakat HQL sorgularinda, INSERT INTO … SELECT … söz dizimi kullanilabilir. HQL sadece baska bir tablodan veya objeden Insert yapilmasini destekler. Örnek olarak:

"insert into Object (id, name) select oo.id, oo.name from OtherObject oo";

Bir backup_Urunler tablosundan veri kaydetmek için de HQL kodu yazilabilir. Buna Bulk-insert denir. Örnek olarak:

Query query = session.createQuery("insert into URUNLER (UrunAdi, UrunFiyat) 
select UrunAdi, UrunFiyat from BACKUP_URUNLER ");
int result = query.executeUpdate();

query.executeUpdate() methotu ile,kaç adet kaydin eklendigi, güncellendigi veya silindigi bilgisini ögrenebiliriz.

Query query = session.createQuery("insert into URUNLER (UrunAdi, UrunFiyat) 
select UrunAdi, UrunFiyat from BACKUP_URUNLER ");
int result = query.executeUpdate();
MessageBox.Show("Kaydedilen Ürün Sayisi: " + result);

 

HQL Update Query Örnegi

Query query = session.createQuery("update URUNLER set UrunAdi = :urun_adi 
where Id = :urun_Id");
query.setParameter("urun_adi ", "Ürün1");
query.setParameter("urun_Id ", 10);
int result = query.executeUpdate();
Query query = session.createQuery("update Stock set URUNLER 
set UrunAdi ='Ürün1' where ID = 10"); 
int result = query.executeUpdate(); 

 

HQL Delete Query Örnegi

Query query = session.createQuery("delete URUNLER where ID = : urun_Id ");
query.setParameter(“urun_Id”, 10);
int result = query.executeUpdate();
Query query = session.createQuery("delete URUNLER where ID = 10");
int result = query.executeUpdate();

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir