Nhibernate-3

Merhaba bu yazımızda Nhibernate ile veritabanı sorgulama metodlarını inceleyeğiz.
Hql
Hibernate Query Language(hql) bildiğimiz ansi-sql’e çok benzeyen hibernate için özelleştirilmiş bir sorgulama dilidir.
Hemen bir örnek yapalım:

OkulDAONHibernate _dao = new OkulDAONHibernate();
IList<Ogrenci> liste= _dao.GetOgrenciByAdSoyadHQL("İsmail", "Koç");

...............
public IList<Ogrenci> GetOgrenciByAdSoyadHQL(string strAd,string strSoyad)
        {
            ISession session = NHibernateHttpModule.CurrentSession;
            return session.CreateQuery("select from Ogrenci o where o.Ad=:AD and o.Soyad=:SOYAD")
                .SetString("AD", strAd)
                .SetString("SOYAD", strSoyad)
                .List<Ogrenci>();
        }

Sql
İlla da Sql! Sql’den vazgeçmem diyenler için:

OkulDAONHibernate _dao = new OkulDAONHibernate();
IList<Ogrenci> liste= _dao.GetOgrenciByAdSoyadSQL("İsmail", "Koç");

............................
    public IList<Ogrenci> GetOgrenciByAdSoyadSQL(string strAd, string strSoyad)
        {
            ISession session = NHibernateHttpModule.CurrentSession;
            return session.CreateSQLQuery("select * from OGRENCI  where Ad=:AD and Soyad=:SOYAD")
                .AddEntity(typeof(Ogrenci))
                .SetString("AD", strAd)
                .SetString("SOYAD", strSoyad)
                .List<Ogrenci>();
        }

Hemen iki fark göze çarpmalı
=>CreateQuery metodu yerine CreateSqlQuery metodunu kullandık.
=>CreateSqlQuery metoduna fazladan AddEntity metodunu ekledik.Takdir edersinizki Nhibernate sql cümlesi içerisinde gönderdiğiniz tablo adı/adlarının hangi sınıfa karşı geldiğini bilmez.Bu yüzden sorguda kullanılacak sınıfın Ogrenci olduğunu belirtiyoruz.
“Ben bu yöntemi ‘select * from Ogrenci’ şeklinde değil de “select ad from Ogrenci’ şeklinde kullanmak istiyorum” diyenler olabilir ama bu şekilde kullanım geçersizdir.Zira tablodaki satır tamamen geldiğinde bir sınıfa karşılık gelir.”Sadece iki kolonu çeksin ve bunları da nesnenin o iki propety’sine set etsin” diyebiliriz ama Nhibernate bu yöntemi desteklemiyor.

Expressions
Expression kullanma yöntemi bu üç yöntemden benim tercih ettiğim yöntem…İzlenebilir olması ve içerisinde string ifadeler bulanmaması(select * from ,inner join….) tercih edilmesinin sebeplerinden…
Hemen örneklerimize başlayalım

1)Soyadı “Koç” olan öğrencileri bulalım.

     ISession session = NHibernateHttpModule.CurrentSession;
     return   session.CreateCriteria(typeof(Ogrenci))
             .Add(Expression.Eq("Soyad","Koç"))
             .List<Ogrenci>();

Gördüğünüz gibi burda Expression sınıfını kullanıyoruz.Bu sınıf içinde işimize yarayan bir çok metod bulunuyor.(Expression.Gt,Ge,Lt,Le,In,IsEmpty,Like,InsensitiveLike…).Hemen aklıma gelmişken hatırlatayım veritabanı olarak oracle kullanıyorsak oracle case sensitive olduğu için expressionlar içine verdiğiniz değerlere dikkat etmeliyiz.”KOÇ” ile “koç” biribirinden farklı değelerdir.

2)Adında “a” harfi geçen öğrencileri soyadlarına göre azalan sırada sıralayalım.

ISession session = NHibernateHttpModule.CurrentSession;
      return   session.CreateCriteria(typeof(Ogrenci))
<div style="display: none"><a href='http://professionalessaywriter.net/'>professional college essay writers</a></div>                .Add(Expression.Like("Ad","%a%"))
                .AddOrder(Order.Desc("Soyad"))
                .List<Ogrenci>();

3)Adı “ismail” ya da “taner” olan öğrencileri soyadlarına göre artan sırada sıralayalım.

	ISession session = NHibernateHttpModule.CurrentSession;
      return   session.CreateCriteria(typeof(Ogrenci))
                .Add(
                    Expression.Or(
                                    Expression.Eq("Ad","İsmail"),
                                    Expression.Eq("Ad","Taner")
                                 )
                     )
                .AddOrder(Order.Asc("Soyad"))
                .List<Ogrenci>();

4)Adı “İsmail” ve soyadı alanı boş olmayan öğrencileri getirelim.

ISession session = NHibernateHttpModule.CurrentSession;
      return   session.CreateCriteria(typeof(Ogrenci))
                .Add(
                       Expression.And(
                                             Expression.Eq("Ad","İsmail"),
                                             Expression.IsNotEmpty("Soyad")
                                          )
                     )
                .List<Ogrenci>();

5)Adı “ismail” olan soyadı “koç” yada “kılıç” olan öğrencileri getirelim.

ISession session = NHibernateHttpModule.CurrentSession;
      return   session.CreateCriteria(typeof(Ogrenci))
                 .Add(Expression.Eq("Ad","İsmail"))
                 .Add(
                      Expression.Or(
                                    Expression.Eq("Soyad","Koç"),
                                    Expression.Eq("Soyad","kılıç")
                                )
                     )
                .List<Ogrenci>();

Example
Diğer bir yöntemimiz de örnek nesne kullanıp sorgulama yapma yöntemidir.

1)Adı “İsmail” olan öğrencileri çekelim.

Ogrenci ogr=new Ogrenci();
      ogr.Ad = "ismail";
           ...............
     ISession session = NHibernateHttpModule.CurrentSession;
     return session.CreateCriteria(typeof(Ogrenci))
                .Add(Example.Create(ogr))
                .List<Ogrenci>();

2)Sınıfı 9B(id=7) olan öğrencileri example kullanarak bulalım.

ISession session = NHibernateHttpModule.CurrentSession;
      Sinif snf = session.CreateCriteria(typeof(Sinif))
            .Add(Expression.Eq("SinifId",7))
           .List<Sinif>()[0];
         ..............
      Ogrenci ogr=new Ogrenci();
      ogr.Sinif = snf;
         ..............
      return session.CreateCriteria(typeof(Ogrenci))
            .Add(Example.Create(ogr))
                 .CreateCriteria("Sinif")
                 .Add(Example.Create(ogr.Sinif))
             .List<Ogrenci>();

5)Önce 7B sınıfını getirdik.
8)Sonra bir öğrenci nesnesi oluşturup “Sinif” property’sine getirdiğimiz snf nesnesini atadık.
10)Daha sonra Ogrenci tipinden bir criteria oluşturduk.
12)Sorgumuzun “Sinif ilişkisi” üzerinden olacağını belirttik.
Yani iç içe iki example vermiş olduk.

Bu örnekleri bu şekilde uzatabiliriz.Bir sonraki yazımızda having,count,sum gibi metodları ve subcriteria sınıfını inceleyeğiz.

3 thoughts on “Nhibernate-3

  1. Pingback: Çok .Net : Alt.Net Başlangıç Klavuzu | Can HANHAN

  2. ahmetbudak

    Bu yazıları yazan arkadaşı kutlarım güzel olmuş, fakat proje dosyalarını zip’lı şekilde verse daha güzel olacak.

Comments are closed.