19 Haziran 2018 Salı

JPA Query Arayüzü

Giriş
Şu satırı dahil ederiz.
import javax.persistence.Query;
Bu sınıf JPQL veya "Native Sql Query" çalıştırabilir.
constructor
EntityManager tarafından yaratılır. Gerekirse Hibernate'e cast edilebilir. Şöyle yaparız.
org.hibernate.ejb.SQLQuery hq = (org.hibernate.ejb.HibernateQuery) query;
Örnek
Şöyle yaparız.
String hql = "...";
Query query = em.createQuery(hql);
Örnek
Şöyle yaparız.
String sql = "select * from mytable";
Query query = em.createNativeQuery(sql);
executeUpdate metodu
Nesneyi günceller.
Örnek
Şöyle yaparız.
Query query = entityManager.createNativeQuery("UPDATE stocks set price=:price WHERE
  id=:id");
query.setParameter("price", stocks.getPrice());
query.setParameter("id" stocks.getId());
query.executeUpdate();
Örnek
Şöyle yaparız.
Employee employee= (Employee)entityManager.find(Employee.class , 1);
 entityManager
     .createQuery("update Employee set name = \'xxxx\' where id=1")
     .executeUpdate();
getResultList metodu - Entity
Açıklaması şöyle.
-If select contains single expression and it's an entity, then result is that entity
-If select contains single expression and it's a primitive, then result is that primitive
-If select contains multiple expressions, then result is Object[] containing the corresponding primitives/entities
Bu metod yerine TypedQuery kullanılmalı. Şöyle yaparız.
TypedQuery<SimpleEntity> q = 
        em.createQuery("select t from SimpleEntity t", SimpleEntity.class);

List<SimpleEntity> listOfSimpleEntities = q.getResultList();
for (SimpleEntity entity : listOfSimpleEntities) {
    // do something useful with entity;
}
getResultList metodu - Multiple SELECT Expressions
Açıklaması şöyle. Untyped List nesnesi yani generics kullanmayan List<Object[]> döner.
JPQL queries can also return results which are not entity objects.
Örnek
Şöyle yaparız.
for(Object row : (List<Object>) q.getResultList()){
  ...
}
Örnek
Şöyle yaparız.
public Map<String, String> getAvailableBorderTypes() {
 // create empty map to store results in. 
 Map<String, String> results = new HashMap<String, String>();

 EntityManager em = entityManagerFactory.createEntityManager();

  // Construct and run query
 String jpaQuery = "SELECT DISTINCT location.mftcc, location.name FROM Location location";
 List<Object[]> resultList = em.createQuery(jpaQuery).getResultList();

 // Place results in map
 for (Object[] borderTypes: resultList) {
  results.put((String)borderTypes[0], (String)borderTypes[1]);
  
 return results;
}
getResultList metodu - Result Classes (Constructor Expressions)
Örnek
Şöyle yaparız.
@SuppressWarnings("unchecked")
List<Patients> result = jpaQuery.getResultList();
getSingleResult metodu
Örnek
Şöyle yaparız.
String nativeSql = SELECT count(1) FROM my_table WHERE conditions;

Query query = entityManager.createNativeQuery(nativeSql);

int total = ((BigDecimal) query.getSingleResult()).intValue();
Örnek
Select cümlesini çalıştırarark tek bir nesne döndürür.
Status status = query.getSingleResult();
Eğer sonuç tek değilse exception atılır.
Query query = ...
try{
  return q.getSingleResult();
}catch(NoResultException| EntityNotFoundException enfex){
  return null;
}catch(NonUniqueResultException ex){
  return null;
}
}
list metodu
join fetch ile şöyle yaparız. Join Fetch lazy olan OneToMany ilişkilerde eager veri çekmek için kullanılır.
Query query = session.createQuery("select c from Category c join fetch c.events 
  where c.parentCategory.categoryId = 1");
//query.setParameter("id", id);
List<Foo> list = query.list();
setFirstResult metodu
Şöyle yaparız.
query.setFirstResult(...);
setMaxResults metodu
Şöyle yaparız.
query.setMaxResults();
setParameter metodu - named parameter
Parametreler :name şeklindedir. Sql cümlesi içinde parametrelere ismen erişir ve değer atar.
Örnek
Şöyle yaparız.
query.setParameter("param1",...);
Örnek
Şöyle yaparız.
entityManager.createQuery("select gne from Entity gne where type(gne) = :subclass")
  .setParameter("subclass", GivenNameEntity.class)
  .getResultList();
setParameter metodu - ordinal parameter
Parametreler ?index şeklindedir. Şöyle yaparız.
Date lastWeekDate = ...;

em.createQuery("SELECT o from Orders o WHERE o.orderDate > ?1")
  .setParameter(1, lastWeekDate, TemporalType.DATE);
scroll metodu
Select cümlesinin sonucunu dolaşabilmemizi sağlar. Şöyle yaparız.
ScrollableResults resultScroll = query.scroll(ScrollMode.FORWARD_ONLY);
unwrap metodu
Hibernate nesnesine dönüştürmek için şöyle yaparız.
entityManager.createNativeQuery("...")
  .unwrap(org.hibernate.Query.class)
  .setParameter("number", new Integer(number))
  .setParameter("userId", userId)
  .setParameter("startDate", startDate)
  .setParameter("endDate", endDate)
  .setResultTransformer(new MyClassTransformer())
  .list();

Hiç yorum yok:

Yorum Gönder