Hibernate veri çekme işlemleri için HQL sorguları ya da criteria yöntemlerinden hangisini nerelerde kullanıyorsunuz? Tablolarımızdan çekmek istediğimiz veriler için hql sorguları oluşturabiliyoruz. Aynı işlemi criteria kullanarak da yapabiliyoruz. Bazı forumlarda eğer yine sql benzeri cümleler yazacaksam neden ORM framework kullanayım deniyor(HQL için). Ancak criteri kullanarak bazı basit sorgular bile oldukça zorlayıcı ve uzun oluyor. Hangi durumlarda bu iki seçenekten hangisini kullanıyorsunuz?

soruldu: 17 Ağu '12, 19:10

semre's gravatar image

semre
1224
cevap kabul oranı: 0%

değiştirildi: 25 Ağu '12, 08:55

Soruyu daha anlasilir sorarsaniz daha hizli cevaplar alabilirsiniz.

(20 Ağu '12, 05:04) CemIkta ♦ CemIkta's gravatar image

JPA 2 ile sorgulama islemleri daha detaylandirildi, Criteria API ile artik bircok sey yapilabiliyor. JPQL(Java Persistence Query Language) artik HQL(Hibernate Query Language) uzerinde standart bir yapi sunuyor. Eger basit sorgulama islemleri yapacaksaniz JPQL kullanmak cok basit, ama kendi projelerinizde yapacaginiz islemlerinizi kolaylastirmak icin tekrar eden DAO islemlerine generic, abstract class'lar yazacaksaniz Criteria API daha yapisal imkanlar sunuyor. Eger asagidaki gibi bir Abstract Service yazacaksaniz Criteria API sizi string query'lerle ugrasmaktan kurtariyor.


package com.mydomain.demo.service;

import java.util.List;
import javax.persistence.EntityManager;

public abstract class AbstractService<t> {
    private Class<t> entityClass;

public AbstractService(Class<t> entityClass) {
        this.entityClass = entityClass;
    }

protected abstract EntityManager getEntityManager();

public void create(T entity) {
        getEntityManager().persist(entity);
    }

public void edit(T entity) {
        getEntityManager().merge(entity);
    }

public void remove(T entity) {
        getEntityManager().remove(getEntityManager().merge(entity));
    }

public T find(Object id) {
        return getEntityManager().find(entityClass, id);
    }

public List<t> findAll() {
        javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
        cq.select(cq.from(entityClass));
        return getEntityManager().createQuery(cq).getResultList();
    }

public List<t> findRange(int[] range) {
        javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
        cq.select(cq.from(entityClass));
        javax.persistence.Query q = getEntityManager().createQuery(cq);
        q.setMaxResults(range[1] - range[0]);
        q.setFirstResult(range[0]);
        return q.getResultList();
    }

public int count() {
        javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
        javax.persistence.criteria.Root<t> rt = cq.from(entityClass);
        cq.select(getEntityManager().getCriteriaBuilder().count(rt));
        javax.persistence.Query q = getEntityManager().createQuery(cq);
        return ((Long) q.getSingleResult()).intValue();
    }
}

// Ornek implementasyonu
public class CustomerService extends AbstractService<customer> {

@PersistenceContext(unitName = "DemoAppPU")
    private EntityManager em;

public CustomerService() {
        super(Customer.class);
    }

@Override
    protected EntityManager getEntityManager() {
        return em;
    }

// diger standart olmayan service method'lari asagiya gelir
    // ...
}

Ayrica asagidaki linklerde JPA query'ler icin degisik ipuclari verilmis:

Ultimate JPA Queries and Tips List - Part 1

Ultimate JPA Queries and Tips List - Part 2

Ultimate JPA Queries and Tips List - Part 3

permanent link

cevaplandı: 26 Ağu '12, 10:47

CemIkta's gravatar image

CemIkta ♦
19.9k29125190
cevap kabul oranı: 36%

değiştirildi: 26 Ağu '12, 10:56

Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×1,079
×109
×86

Soruldu: 17 Ağu '12, 19:10

Görüntüleme: 1,810 kez

Son güncelleme: 26 Ağu '12, 10:56

powered by BitNami OSQA