19 Kasım 2015 Perşembe

HQL (Hibernate Query Language)

Hibernate ile kullanılan sorgulama dili Hibernate Query Language (HQL). Ayrıca Criteria Query ya da Native SQL ile sorgulama yapmak ta mümkün.

HQL ve Birincil Önbellek

HQL ile sorgulama yapılırken hibernate birinci kademe önbelleği kullanır. Klasik SQL ile sorgu yapılırken birinci kademe önbellek kullanmamaktadır. Bu durumu anlatan şekil burada.


HQL ve Sorgulama Parametreleri

HQL ile sorgulama yaparken sorgunun içine "?" veya ":parametreismi" formatında değişken alanlar vererek, dışarıdan dinamik sorgu parametreleri kullanmak mümkün.

Sorgu içindeki alanların değerleri Query sınıfının setParameter(int position,Object val) veya setParameter(String name,Object val) metodu ile kullanarak atanabilir.

1. Pozisyon Kullanımı - Positional Parameter
Parametre değeri yerine soru işareti karakteri koyarız. Daha sonra setString, setParameter gibi metodlarla değeri atarız.

setParameter için şöyle örnek
Query query = session.createQuery("from ... where x > ?");
query.setParameter(0, value);
setString için şöyle örnek
Query hqlQuery = session.createQuery("from Orders as orders where orders.id = ?");
List results = hqlQuery.setString(0, "123-ADB-567-QTWYTFDL").list();

2. İsim Kullanımı - Named Parameter
Parametre değeri yerine : karakteri ile başlayan bir isim koyarız. Daha sonra setString, setParameter, setLong gibi metodlarla değeri atarız.

setParameter için örnek.
Query query = session.createQuery("from ... where x between :f1 and :f2 ");
query.setParameter("f1", fromDate );
query.setParameter("f2", toDate);
setLong için örnek
Query query = session.createQuery("from Emp as emp where emp.inc > :incentive");
List results = query.setLong("incentive", new Long(10000)).list();

3. İsim Listesi - Named Parameter List
setParameterList metodunu kullanırız. Mesela "in clause" kullanılmak istenirse, named parameter atamak gerekiyor. Örnek Spring hibernate template list as a parameter sorusunda görülebilir.
this.getHibernateTemplate() 
      findByNamedParam("select distinct ci.customer " + 
             "from CustomerInvoice ci " + 
              "where ci.id in (:ids) ", "ids", ids); 
Bir başka örnek ise aşağıda. Bu örnekte setParameterList() metoduna geçilen verinin int değil Integer olması gerektiğine dikkat etmek lazım.
Session session = sessionFactory.getCurrentSession();
    session.beginTransaction();
    Query query = session.createQuery(DELETE_NEWS_BY_ID);
    query.setParameterList(ID, Arrays.asList(idList));
    query.executeUpdate();
    session.getTransaction().commit();
Örnekte bir string listesi için arama yapılıyor.
List items = new ArrayList(); 
items.add("book"); items.add("clock"); items.add("ink");
List results = session.createQuery("from Cart as cart where
 cart.item in (:itemList)").setParameterList("itemList", items).list();
4. Java Bean
Verilen nesnenin getter() metodları kullanılır. Örnekte getName() ve getAuthor metodlarının olduğu varsayılıyor.
Query hqlQuery = session.createQuery("from Books as books where book.name = :name
 and book.author = :author");
List results = hqlQuery.setProperties(javaBean).list();
5. Native SQL
Şöyle yaparız.
Query sqlQuery = session.createSQLQuery("Select * from Books where author = ?");
List results = sqlQuery.setString(0, "Charles Dickens").list();

HQL ve uniqueResult
Örneği buradan aldım. Tek bir sonuç gelecekse bu uniqueResult metodu kullanılabilir.
Query query = session.createQuery("from MasUser as m where m.userName = 'test' ");
MasUser masUser = (MasUser) query.uniqueResult();

Hiç yorum yok:

Yorum Gönder