13 Mart 2019 Çarşamba

JPA CriteriaQuery Arayüzü - Select

Giriş
Select ile single selection veya multi selection yapılabilir. Select başlığı altına (select, distinct, multiselect, array, tuple, construct) kullanımları girer.

select() ile Object veya Object listesi elde edilir.
multiselect() ile Object[] listesi elde edilir.
array() ile Object[] listesi elde edilir. Bu anlamda array ile multiselect aynı şeydir.
tuple() ile Tuple elde edilir.
construct() ile bizim belirttiğimiz nesne elde edilir. Yani projection yapılır

Genel Kullanım
1. CriteriaBuilder.createQuery() ile CriteriaQuery nesnesi yarat
2.  CriteriaQuery.from () ile Root nesne yarat
3.  Root nesne ile predicate yarat.
4. CriteriaQuery.select (root).where(cb.X());
şeklinde sorgu yap.

Bir CriteriaQuery nesnesi yaratılır ve select işlemi için ayarlanır. Bu nesne EntityManager.createQuery() metoduna geçilir ve bir TypedQuery nesnesi elde edilir. TypedQuery nesnesinin getResultList() veya getSingleResult() metodu çağrılır. Şöyle yaparız.
CriteriaQuery<Father> criteriaQueryForFatherDTOs = ...;
...
TypedQuery<Father> typedQuery = entityManager.createQuery(criteriaQueryForFatherDTOs);
...
List<Father> listOfFathers = typedQuery.getResultList();
distinct metodu
JPQL olarak şuna benzer
SELECT DISTINCT c.currency FROM Country c
Örnek
Şöyle yaparız. distinct() işleminin döndürdüğü yeni CriteriaBuilder nesnesini saklamak gerekir.
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Father> cq = builder.createQuery(Father.class);
Root<Father> rootForFather = cq.from(Father.class);
cq = cq.select(rootForFather).distinct(true);
TypedQuery<Father> typedQuery = entityManager.createQuery(cq);
multiselect metodu
Örnek
Şöyle yaparız.
Root<Student> teacher = query.from(Student.class);
query.multiselect(cb.avg(teacher.get("salary")),...);

Diğer

1. Array Çekmek
Root nesneden seçilecek sütun isimleri alınır ve CriteriaBuilder.array() metoduna verilir. Bu çağrının sonucu da CriteriaQuery.select metoduna verilir. Böylece bir List<Object[]> çekilir.
Örnek
Şöyle yaparız
CriteriaQuery<Object[]> q = cb.createQuery(Object[].class);
Root<Country> c = q.from(Country.class);
q.select(cb.array(c.get("name"), c.get("capital").get("name")));


List<Object[]> results = em.createQuery(q).getResultList();

for (Object[] result : results) {

  System.out.println("Country: " + result[0] + ", Capital: " + result[1]);

}
2. Tuple Çekmek
Root nesneden seçilecek 2 tane sütun isimi alınır ve CriteriaBuilder.createTupleQuery() metoduna verilir. Bu çağrının sonucu da CriteriaQuery.select metoduna verilir. Böylece bir List<Tuple[]> çekilir.

3. Construct Çekmek - Projection
Örnek
Şöyle yaparız
CriteriaQuery<PersonDetails> q = cb.createQuery(PersonDetails.class);
Root<Person> c = q.from(Person.class);
q.select(cb.construct(PersonDetails.class,
  c.get(Person_.firstName),
  c.get(Person_.lastName),
  c.get(Person_.birthdate)
));
Örnek
Şöyle yaparız
CriteriaQuery<CountryAndCapital> q = cb.createQuery(CountryAndCapital.class);
Root<Country> c = q.from(Country.class);
q.select(cb.construct(CountryAndCapital.class,
      c.get("name"), c.get("capital").get("name")));

Hiç yorum yok:

Yorum Gönder