Yazılım Mühendisliği

Eylül 22, 2008

Nhibernate-3

Filed under: Nhibernate,ORM — Yahya KOÇ @ 7:26 pm

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))
                    .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.

Yorum yapın »

Henüz yorum yapılmamış.

Bu yazıya yapılan yorumlar için RSS beslemeleri. URI'nin geri izlemesini yap.

Yorum yapın

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Değiştir )

Twitter picture

You are commenting using your Twitter account. Log Out / Değiştir )

Facebook photo

You are commenting using your Facebook account. Log Out / Değiştir )

Connecting to %s

Theme: Rubric. WordPress.com'dan blog alın.

Follow

Get every new post delivered to your Inbox.