HQL(Hibernate Query Language), Hibernate’de kullanılan son derece güçlü nesneye yönelik (Object-Oriented) bir sorgulama dilidir. Söz dizimi olarak Sql’e çok benzer, Sql’den temel farkı, tablo ve sütunların yerine sınıflar ve özellikleri kullanmasıdır. Sql (Structured Query Language) veri tabanı nesneleri ile birlikte çalışırken, Hql sınıf ve nesnelerle birlikte çalışır.
Hql, ilişkisel nesne modellerini esas alır. Hql Polymorphism ve Associations’ı destekler. Hql, Hibernate aracılığı ile otomatik olarak sql sorgusu oluşturur ve geri planda, veritabanında bunları uygular.
Hql kullanırken aynı zamanda, Criteria API ve Native SQL sorguları kullanarak QBC (Query By Criteria) , QBE (Query BY Example) ‘da kullanılabilir.
Hql’de sınıf isimleri hariç, büyük-küçük harf duyarlılığı yoktur, yani terimleri nasıl yazdığımızın önemi yoktur. Ama nesneler ile ilgili tanımlamalar olduğu gibi kullanılmak zorundadır.
Hql’de sınıf isimleri hariç, büyük-küçük harf duyarlılığı yoktur, yani terimleri nasıl yazdığımızın önemi yoktur. Ama nesneler ile ilgili tanımlamalar olduğu gibi kullanılmak zorundadır.
Neden Hql
- Relational İşlemleri Destekler: Hql objeler üzerinde sql sorguları yazmaya izin verir, tablo ve sütunların yerine sınıflar ve özellikleri kullanır.
- Sorgu sonuçları Obje Olarak Döner: HQL sorgu sonuçlarını, kullanımı kolay olan nesne şeklinde döndürür.
- Polimorfik Sorguları Destekler: HQL,Polimorfik Sorguları destekler. Sorgu sonucunda, tüm alt nesneleri de birlikte döndürür.
- Kullanım Kolaydır: Hql kullanım olarak Sql’e çok benzer, bu da alışılagelmiş kullanım ve öğrenme kolaylığı getirir. Ayrıca Aggregation (max, avg), Ordering, Sub queries, Inner/outer/full joins, pagination gibi pek çok özelliği destekler.
- Veritabanı Bağımsızdır: (Kullanılan veritabanı temel özelliği destekliyorsa) HQL’de yazılmış sorgular veritabanı bağımsızdır.
Parametre Kullanma
Hql ‘de sorgumuza dışarıdan parametre gönderebiliriz. Bu sırada,özellikle kullanıcılardan gelecek parametreler için, SQL injection sorununu düşünmemize gerek yoktur. Hql bu kontrolleri kendi içinde yapar.
Sorguya dışarıdan bir parametre gönderildiğinde, gönderilen parametre “:” simgesinden sonra kullanılır. Sorgumuza parametre gönderen basit bir örnek:
1
2
3
4
| String hql = "FROM URUNLER WHERE ID = :urun_Id" ; Query query = session.createQuery(hql); query.setParameter( "urun_Id" ,10); List results = query.list(); |
AS İfadesi (Alias)
As ifadesi, tıpkı Sql de olduğu gibi, Nesneleri özel olarak adlandırmak için kullanılır. As ifadesi opsiyoneldir. İstenirse nesne adından sonra doğrudan takma (alias) ad da kullanılabilir.
1
2
| String hql = "FROM URUNLER AS A" ; String hql = "FROM URUNLER A" ; |
Aynı anda iki objeden de sorgulama yapabilir ve bunları alias olarak kullanabiliriz.
Örnek olarak:
1
2
| String hql = "FROM URUNLER AS A, URUN_TEDARIKCI AS B" ; String hql = "FROM URUNLER A, URUN_TEDARIKCI B" ; |
Select İfadesi
HQL Nesneye yönelik sorgulama yapar demiştik. Eğer nitelik değil de nesne getirmek istersek “select” ifadesini kullanmamız gerekmez. Ama eğer sorgu sonucunda dönen değerimiz özel olarak belirtilen bir veya birkaç alan ise “Select” ifadesini kullanmak zorundayız. Örnek olarak URUNLER nesnemizdeki tüm verileri sorgulamak için:
1
| String hql = "FROM URUNLER" ; |
Yazmamız yeterlidir. Ama sadece UrunAdi alanını sorgulayacaksak:
1
| String hql = "SELECT UrunAdi FROM URUNLER" ; |
Yazmamız gerekir. Burada dikkat etmemiz gereken, UrunAdi alanı, tablodaki bir alan değildir. URUNLER nesnesinin bir özelliğidir.
Where İfadesi
Sorgularımızda, veritabanından dönen sonuçları, koşullara göre, sınırlandırmak istediğimizde "Where" ifadesini kullanırız. Örnek olarak:
1
2
3
| String hql = "FROM URUNLER WHERE ID = 10" ; Query query = session.createQuery(hql); List results = query.list(); |
Join İfadesi
SQL bulunan inner join, left outer join ve right outer join yapıları HQL’de kullanılabilir. Örnek olarak:
1
2
3
| String hql = "FROM URUNLER LEFT OUTER JOIN URUN_TEDARIKCI" ; Query query = session.createQuery(hql); List results = query.list(); |
Order By İfadesi
Hql, sorgumuzun sonucunda dönen değerleri sıralayabilmemize olanak sağlar. Bunun içinde Sql’deki gibi Order by ifadesini kullanırız. Artan veya azalan sırada olduğunu belirtmek için de ASC ve DESC ifadeleri kullanılır. Örnek olarak:
1
2
3
| String hql = "FROM URUNLER ORDER BY UrunFiyat DESC" ; Query query = session.createQuery(hql); List results = query.list(); |
İki veya daha fazla değere göre sıralama yapmak için ”,” ile ayırmak yeterlidir. Örnek olarak:
1
2
3
| String hql = "FROM URUNLER ORDER BY UrunFiyat DESC, UrunAdi DESC" ; Query query = session.createQuery(hql); List results = query.list(); |
Group By İfadesi
Group By ifadesi tıpkı Sql de olduğu gibi, sorgu sonucunda dönen değerleri gruplamamızı sağlar. Group By ifadesi kullanılarak oluşturulabilecek basit bir cümle örneği:
1
2
3
| String hql = "SELECT SUM(UrunFiyat), UrunAdi FROM URUNLER GROUP BY UrunAdi" ; Query query = session.createQuery(hql); List results = query.list(); |
Like İfadesi
Like ifadesi de tıpkı Sql de olduğu gibidir Basit bir örnek:
1
2
3
| String hql = " FROM URUNLER WHERE UrunAdi LIKE '%ab%' " ; Query query = session.createQuery(hql); List results = query.list(); |
Toplama Methotları
HQL, SQL için kullanılan pek çok toplama methotunu destekler. Bunlar SQL ile aynı mantıkta çalışır. HQL in desteklediği toplama methotları şunlardır:
- avg(property name) : Belirtilen alanın değerlerinin ortalamasını döndürür.
- count(property name or *): Belirtilen alanın değerlerinin adedini döndürür.
- max(property name) : Belirtilen alanın değerlerinin en büyüğünü döndürür.
- min(property name) : Belirtilen alanın değerlerinin en küçüğünü döndürür.
- sum(property name) : Belirtilen alanın değerlerinin toplamını döndürür .
Not: Burada “Distinct” ifadesi de kullanılabilir. Mesela sorgumuzda, aynı ada sahip ürünleri tek ürün olarak kabul ederek, toplam ürün çeşidimizi bulmaya çalışalım:
1
2
3
| String hql = "SELECT count(distinct UrunAdi) FROM URUNLER" ; Query query = session.createQuery(hql); List results = query.list(); |
Sorgu Sonucunda Dönen Satır Sayısı (Pagination)
Hql ‘de, sorgu sonucunda dönecek olan satırları belirlemek için kullanılan 2 yöntem vardır.
Query setFirstResult(int startPosition) : Bu methot, aldığı integer sayı ile listemize eklemeye başlayacağımız ilk değeri belirleriz.
Query setMaxResults(int maxResult): Bu methot, sorgu sonucunda dönecek satırların maksimum sayısını belirler.
Query setMaxResults(int maxResult): Bu methot, sorgu sonucunda dönecek satırların maksimum sayısını belirler.
Bu iki methotu sayfalama yapısında da kullanabiliriz. Mesela Sorgumuzun ilk 10 kaydını getirelim:
1
2
3
4
5
| String hql = "FROM URUNLER" ; Query query = session.createQuery(hql); query.setFirstResult(1); query.setMaxResults(10); List results1 = query.list(); |
İkinci 10 kayıt için:
1
2
3
4
5
| String hql = "FROM URUNLER" ; Query query = session.createQuery(hql); query.setFirstResult(11); query.setMaxResults(10); List results2 = query.list(); |
HQL Select Query Örneği
1
2
3
| Query query = session.createQuery( "from URUNLER where ID = :urun_Id " ); query.setParameter( "urun_Id" , 10); List list = query.list(); |
1
2
| Query query = session.createQuery( "from URUNLER where ID=10 " ); List list = query.list(); |
HQL sorgularında, veritabanında bulunan tablolar değil, persistent object leri kullanıldığı için, nesnenin adı yerine paketadi+sınıfadı şeklinde de kullanılabilir. Örnek olarak:
1
2
| Query query = session.createQuery( "from com.hibernate.URUNLER where ID=10 " ); List list = query.list(); |
HQL Insert Query Örneği
SQL de olan INSERT INTO … VALUES. Şeklinde kullanım HQL de yoktur. Fakat HQL sorgularında, INSERT INTO … SELECT … söz dizimi kullanılabilir. HQL sadece başka bir tablodan veya objeden Insert yapılmasını destekler. Örnek olarak:
1
| "insert into Object (id, name) select oo.id, oo.name from OtherObject oo" ; |
Bir backup_Urunler tablosundan veri kaydetmek için de HQL kodu yazılabilir. Buna Bulk-insert denir. Örnek olarak:
1
2
3
| 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 kaydın eklendiği, güncellendiği veya silindiği bilgisini öğrenebiliriz.
1
2
3
4
| Query query = session.createQuery("insert into URUNLER (UrunAdi, UrunFiyat) select UrunAdi, UrunFiyat from BACKUP_URUNLER "); int result = query.executeUpdate(); MessageBox.Show( "Kaydedilen Ürün Sayısı: " + result); |
HQL Update Query Örneği
1
2
3
4
5
| 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(); |
1
2
3
| Query query = session.createQuery("update Stock set URUNLER set UrunAdi = 'Ürün1' where ID = 10"); int result = query.executeUpdate(); |
HQL Delete Query Örneği
1
2
3
4
5
| 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(); |
Hiç yorum yok:
Yorum Gönder