CriteriaQuery etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
CriteriaQuery etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

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")));

11 Kasım 2018 Pazar

JPA CriteriaQuery Arayüzü

Giriş
Bu arayüz sql cümlesini kurar. Cüme daha sonra EntityManager'a geçilir ve TypedQuery nesnesi oluşturulur. Bu nesnenin metodları ile veriye erişilir.

Kullanım
Örnek- select id where name = ?
Tek bir sütun listesi okumak için şöyle yaparız.
public List<Integer> getUserIdsByName(String name) {

  CriteriaBuilder builder = session.getCriteriaBuilder();
  CriteriaQuery<Integer> query = builder.createQuery( Integer.class );

  Root<User> root = query.from( User.class );
  query.select( root.get( "id" ) );
  query.where( builder.equal( root.get( "name" ) , name ) );

  return session.createQuery( query ).getResultList();
}
Örnek - select tariff,id,name where name = ?
Çoklu sütun okuyarak UserIdAndName nesne listesi dönmek için şöyle yaparız.
public List<UserIdAndName> getUserIdAndNameByName(String name) {

  CriteriaBuilder builder = session.getCriteriaBuilder();
  CriteriaQuery<UserIdAndName> query = builder.createQuery( UserIdAndName.class );

  Root<User> root = query.from( User.class );
  query.where( builder.equal( root.get( "name" ) , "9" ) );
  query.select( builder.construct( UserIdAndName.class ,
    root.get( "tariff" ).get( "id" ) , root.get( "name" ) ) );

  return session.createQuery( query ).getResultList();
}
Örnek - select *
Çoklu sütun okuyarak Father nesne listesi dönmek için şöyle yaparız.
CriteriaQuery<Father> criteriaQueryForFatherDTOs = ...;
...
TypedQuery<Father> typedQuery = entityManager.createQuery(criteriaQueryForFatherDTOs);
...
List<Father> listOfFathers = typedQuery.getResultList();
Örnek - select * from Gust where propertyIdentifier = ? and firstName like %?%
Şöyle yaparız.
public List<Guest> findGuests(Guest searchedGuest) {

  CriteriaBuilder cb = em.getCriteriaBuilder();
  CriteriaQuery<Guest> cq = cb.createQuery(Guest.class);
  Root<Guest> quest = cq.from(Guest.class);
  List<Predicate> predicates = new ArrayList<Predicate>();

  if (searchedGuest.getPropertyIdentifier != null) {
    predicates.add(cb.equal(quest.get("propertyIdentifier"),
      searchedGuest.getPropertyIdentifier));
  }
  if (searchedGuest.getFirstName != null) {
    predicates.add(cb.like(quest.get("firstName"), "%" +
      searchedGuest.getFirstName + "%"));
  }
  // other predicates

  cq.select(quest).where(predicates.toArray(new Predicate[] {}));
  List<Guest> guests = em.createQuery(cq).getResultList();
  return guests;
}
Örnek
Çoklu sütun okuyarak B ve A nesne listeleri dönmek için ş Şöyle yaparız.
CriteriaBuilder cb = entityManager.getCriteriaBuilder();

// Select distinct aid from B
CriteriaQuery<B> bQuery = cb.createQuery(B.class);
Root<B> bRoot = bQuery.from(B.class);
bQuery.select(bRoot.get("a").get("id")).distinct(true);

// Select * from A where aid not in ()
CriteriaQuery<A> aQuery = cb.createQuery(A.class);
Root<A> aRoot = aQuery.from(A.class);
aQuery.select(aRoot).where(cb.not(aRoot.get("id").in(bQuery)));

TypedQuery<A> query = entityManager.createQuery(aQuery);
List<A> result = query.getResultList();
consructor
CriteriaBuilder tarafından yaratılır. Şöyle yaparız.
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Father> criteriaQueryForFatherDTOs = builder.createQuery(Father.class);
distinct metodu
Şöyle yaparız.
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Father> criteriaQueryForFatherDTOs = builder.createQuery(Father.class);
Root<Father> rootForFather = criteriaQueryForFatherDTOs.from(Father.class);
criteriaQueryForFatherDTOs.select(rootForFather).distinct(true);
from metodu
Şöyle yaparız.
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Father> criteriaQueryForFatherDTOs = builder.createQuery(Father.class);
Root<Father> rootForFather = criteriaQueryForFatherDTOs.from(Father.class);
orderBy metodu
Şöyle yaparız.
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<UserDTO> cq = cb.createQuery(UserDTO.class);
Root<UserDTO> iRoot = cq.from(UserDTO.class);
... //set where clause on CriteriaBuilder
List<Order> orders = new ArrayList<Order>(2);
orders.add(cb.asc(iRoot.get("firstName")));
orders.add(cb.asc(iRoot.get("lastName")));

cq.orderBy(orders);
TypedQuery<UserDTO> query = em.createQuery(cq);

List<UserDTO> result = query.getResultList();
select metodu - Root
Şöyle yaparız.
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Father> criteriaQueryForFatherDTOs = builder.createQuery(Father.class);
Root<Father> rootForFather = criteriaQueryForFatherDTOs.from(Father.class);
criteriaQueryForFatherDTOs.select(rootForFather).distinct(true);
select metodu - Sütun isimleri
Seçilecek sütun ismini belirtir. Şöyle yaparız.
public Long calculateCount(String filters) {
  CriteriaBuilder cb = em.getCriteriaBuilder();
  CriteriaQuery<Long> sc = cb.createQuery(Long.class);
  Root<UserDTO> iRoot = sc.from(UserDTO.class);
  List<Predicate> predicates = new ArrayList<Predicate>();

  predicates.add(cb.like(cb.lower(iRoot.<String>get("login")),
    "%" + filters.toLowerCase() + "%"));
  

  Predicate[] predArray = new Predicate[predicates.size()];
  predicates.toArray(predArray);

  sc.select(cb.count(iRoot));

  sc.where(predArray);
  Long count = em.createQuery(sc).getSingleResult();

  return count;

}
where metodu - Predicate
Şöyle yaparız.
String columnName = ...;
String filters = ...
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<UserDTO> cq = cb.createQuery(UserDTO.class);
Root<UserDTO> iRoot = cq.from(UserDTO.class);
List<Predicate> predicates = new ArrayList<Predicate>();

predicates.add(cb.like(cb.lower(iRoot.<String>get(columnName)),
  "%" + filters.toLowerCase() + "%"));


Predicate[] predArray = new Predicate[predicates.size()];
predicates.toArray(predArray);

cq.where(predArray);

List<Order> orders = new ArrayList<Order>(2);
orders.add(cb.asc(iRoot.get("firstName")));
orders.add(cb.asc(iRoot.get("lastName")));

cq.orderBy(orders);
TypedQuery<UserDTO> query = em.createQuery(cq);

List<UserDTO> result = query.getResultList();