16 Mart 2020 Pazartesi

JPA JPQL - Java Persistence Query Language

Giriş
JPQL'de veritabanındaki sütun isimleri değil, nesnemideki field isimler kullanılır. Örneğin order by yapmak isteyelim. Nesnemizin alan ismi creationTime olsun. Veritabanındaki sütun ismi ise CREATION_TIME olsun.
" ... order by c.creationTime"
şeklinde kullanırız.

floor
Açıklaması şöyle
There are several improvements and new capabilities in the querying capabilities. Jakarta Persistence QL (JPQL) has new numeric functions such as CEILINGFLOORROUND, and new functions to handle date and time (along with compatible methods via criteria API). For dates, for example, the SQL types LOCAL DATELOCAL TIME and LOCAL DATETIME can be retrieved by functions as java.time.LocalDatejava.time.LocalTime and java.time.LocalDateTime, respectively.

like
Şöyle yaparız.
public List<Employee> getFirstNamesLike(String firstName) {

  Query query = entityManager.createNativeQuery("SELECT em.* FROM
    spring_data_jpa_example.employee as em " +
    "WHERE em.firstname LIKE ?", Employee.class);
  query.setParameter(1, firstName + "%");
  return query.getResultList();
}
like
Şöyle yaparız.
SELECT e from MyEntity e WHERE LOWER(e.myAttribute) ...
select
DTO için şöyle yaparız.
@Query("select n from Client n where n.nom like :x")
Hibernate HQL ile arasındaki en büyük fark select n kelimesinin kullanılması. HQL'deki şu cümle
from Client n where n.nom=:x order by description asc"
şu hale geliyor
select n from Client n where n.nom=:x order by description asc"
select ve join
Şöyle yaparız.
@Query("select a from A a join a.bs b where b.prop1 = :prop1 and ...")
select ve left join
JPA JPQL Join yazısına taşıdım

select ve JPA Tuple
JPA Tuple için şöyle yaparız.
"select p.id as id, p.title as title from Post p where p.createdOn > :fromTimestamp"
select ve DTO Projection
1. DTO projection ne zaman gerekir ?
- Örneğin Eager OneToMany ilişki varsa ve bu ilişkiyi göndermek istemiyorsak
- Nesnenin tüm alanları yerine belli bir kısmını göndermek istiyorsak

2. JPQL Nasıl Olmalı
Önce bir DTO sınıfı tanımlanır. DTO sınıfı tüm alanları dahil eden bir constructor sağlamalıdır. Yani AllArgsConstructor gerekir çünkü JPQL içinde bu constructor kullanılır.

Daha sonra JPQL içinde DTO'nun tüm paket ismini kullanmak gerekir çünkü JPA sağlayıcısı bu paketi tanımamaktadır.

Örnek
DTO Projection için şöyle yaparız.
"select new com.foo.PostDTO (p.id as id, p.title) from Post p where
  p.createdOn > :fromTimestamp"
Örnek
Elimizde şöyle bir kod olsun.
public class ProgramDTO {

  private Long id;
  private String programTitle;
  private String description;
  private String programType;
  private String price;
}
EntityManager ile şöyle yaparız. Burada kısa olsun diye JPQL'de DTO'nun tüm paket ismini yazmadım.
entityManager
  .createQuery("select new ProgramDTO(p.id, p.programTitle, p.description,
 p.programType, p.price from Program p")
  .getResultList();

Hiç yorum yok:

Yorum Gönder