Ensar Basri Kahveci

overly distributed

Hibernate'de ResultTransformer kullanımı

Posted at — Jul 24, 2011

ResultTransformer, adından da az çok anlaşılacağı gibi, Hibernate sorgularından dönen değerleri bean, map, list gibi nesnelere dönüştürmeye yarıyor.

Ogrenci, Ders, DersKaydi entity’lerimiz olduğunu varsayalım. Ogrenci entity’miz sistemde kayıtlı öğrencileri, Ders entity’si açılan dersleri, DersKaydi entity’miz de Ogrenci ile Ders nesnelerini eşleştiren ve öğrencinin ders kaydına yönelik bilgileri tutan entity olsun.

Yazacağımız sorguyla sadece ihtiyacımız olan <öğrenci adı, kayıt yaptığı ders adı> ikilisini çekmek isteyelim. OgrenciDTO sınıfımızda da ogrenciAdi ve dersAdi alanlarının olduğunu varsayalım.

<öğrenci adı, kayıt yaptığı ders adı> bilgisini çekmek için yazacağımız HQL veya Criteria sorgusu default olarak bize bir Object[] listesi döner. Listenin her bir elemanı olan Object[]in ilk elemanı öğrenci adı iken, ikinci elemanı da kayıt yaptığı dersin adı olur. Bu davranışı Criteria veya Query nesnesi üzerinde setResultTransformer(Transformers(Transformers.ALIAS_TO_ENTITY_MAP); çağrısı ile Object[] yerine Map dönecek şekilde değiştirebiliriz. Bu çağrı ile dönen listenin her elemanı Object[] yerine Map olur ve sorgudan dönen  listeden aldığımız map nesnelerinin üzerinde map.get("ogrenciAdi”); gibi bir çağrı ile öğrenci adı değerine ulaşabiliriz.

Daha da güzeli, sorgudan dönen değerleri doğrudan bir sınıfın alanlarına eşleştirip Hibernate’in bizim için sorgudan dönen değerleri nesnelere dönüştürmesini sağlayabiliriz. Az önce bahsettiğim OgrenciDTO nesnesi üzerinde bunu mesela şöyle yapıyoruz.

public class OgrenciDTO {
  private String ogrenciAdi;
  private String dersAdi;

  public OgrenciDTO() { }

  // getter, setter metodlar...
}
List ogrencilerinDersleri = s.createCriteria(DersKaydi.class)
  .createAlias("ogrenci", "ogr").createAlias("ders", "drs")
  .setProjection(Projections.projectionList()
                   .add(Projections.property("ogr.ad"), "ogrenciAdi")
                   .add(Projections.property("drs.ad"), "dersAdi")
          )
          .setResultTransformer(Transformers.aliasToBean(OgrenciDTO.class))
          .list();

Gördüğünüz gibi DersKaydi sınıfı üzerinde yarattığımız Criteria‘da öncelikle DersKaydi sınıfının ogrenci ve ders alanlarına alias‘lar atadık. Sonra öğrenci adı ve ders adı değerleri üzerinde Projection yaparak sorgumuzdan yalnızca bu değerlerin dönmesini sağladık ve son olarak yaptığımız .setResultTransformer(Transformers.aliasToBean(OgrenciDTO.class)) çağrısı ile dönen ikilileri üzerinden OgrenciDTO nesneleri yaratılmasını ve değerlerinin atanmasını sağladık.

Hibernate içerisinde bir çok ResultTransformer gerçekleştirimi hazır olarak geliyor. Şu bağlantıdan ResultTransformer gerçekleştirimlerine göz atabilirsiniz.

Bilgiyi HQL ile çekseydik de şöyle yapacaktık:

List ogrencilerinDersleri = s.createQuery(
  "SELECT dk.ogrenci.ad AS ogrenciAdi, dk.ders.ad AS dersAdi" +
  "FROM DersKaydi AS dk")
  .setResultTransformer(Transformers.aliasToBean(OgrenciDTO.class))
  .list();
comments powered by Disqus