21 Kasım 2018 Çarşamba

HQL

Giriş
HQL Query arayüzü tarafından kullanılır. Şöyle yaparız.
String hql = "...";
Query q = session.createQuery(hql);
Foo foo = q.list().get(0);
HQL ve SQL Farkı
Açıklaması şöyle.
HQL queries cannot perform DDL operations.
HQL queries cannot insert single record into table.
An HQL query gives negligible performance degradation because of conversions when compared to SQL.
HQL queries cannot call PL/SQL program.
count
Şöyle yaparız.
"select count(*) from BookDetails b where b.language=:language ");
delete
Bulk delete cascade işlemi yapmaz.
Örnek
Şöyle yaparız.
@Transactional
public void deleteUser(int userId) {
  Query q = session.createQuery("delete User where id = :userId");
  query.setParameter("userId", userId);
  q.executeUpdate();
}
Örnek
Şöyle yaparız.
Session session = ...; 
String queryStr = "delete from SuperParent where name='...'";
Query query = session.createQuery(queryStr);
int noOfRows deleted = query.executeUpdate();
from
Şöyle yaparız.
"FROM Customer";
join kelimesi - inner join
inner kelimesi yazılmayabilir. İki tablonun kesişimini bulur. Şeklen şöyle.
Örnek
Kullanıcı adı admin olan kişinin almadığı eğitimleri göstermek için şöyle yaparız.
 "from Training tr where tr.id not in
 ( select t.id from TrainUser tu
   join tu.training t join tu.user u 
   where u.username = :uname )"
Örnek
Şöyle yaparız.
"FROM CvtermProp cp "
"JOIN db database  ON (database.dbId = cp.value) "
"WHERE cp.typeId=3333 AND cp.cvtermId=1111 ");
join fetch kelimesi
Açıklaması şöyle. Lazy one ilişkilerinde yüklenemsini sağlar.
A "fetch" join allows associations or collections of values to be initialized along with their parent objects using a single select. This is particularly useful in the case of a collection. It effectively overrides the outer join and lazy declarations of the mapping file for associations and collections.
Elimizde şöyle bir kod olsun.
@Entity
public class Customer implements Serializable {


  @ManyToMany(cascade=CascadeType.ALL)
  @JoinTable(name="cheese_customers",
    joinColumns={@JoinColumn(name="CUSTOMER_ID", referencedColumnName = "accountNumber")},
    inverseJoinColumns={@JoinColumn(name="PRODUCT_ID", referencedColumnName="id")})
  private List<Cheese> cheeses = new ArrayList<>();
  ...
}
Şöyle yaparız.
session.createQuery("from Customer C join fetch C.cheeses").list();
insert 
Açıklaması şöyle.
Statement types
Both HQL and JPQL allow SELECT, UPDATE and DELETE statements to be performed. HQL additionally allows INSERT statements, in a form similar to a SQL INSERT FROM SELECT.
left join with - left outer join
outer kelimesi yazılmayabilir. Şeklen şöyle.

Soldaki tablonun tamamını dahil eder, sağdaki kesişimler varsa ekler yoksa null çıktı verir.

Şöyle yaparız.
left join i3.analisys a3 WITH a3.something = :someValue
new map
Sonucu List<Map<...,...>> olarak alabilmeyi sağlar.
Örnek
Şöyle yaparız
Session session = sessionFactory.getCurrentSession();
String HQL_QUERY = "select new map(user.id as id, user.firstName as fullName)
  from User user";        
List<Map<String,String>> usersList = session.createQuery(HQL_QUERY).list(); 
Örnek
Şöyle yaparız.
@Query("select  new Map(u.username as username , p.pname as pname) from Users u join
 u.priviJoin p where u.username = :uname")
List<Users> findByUsername(@Param("uname") String uname);
scalar function
HQL ile veritabanına özel scalar function kullanılabilir.

Örnek
MySQL'deki time_to_sec meodunu kullanmak için şöyle yaparız.
"select count(*) from ProgramGroupEvent as eventLog 
  where eventLog.id= :id and
        time_to_sec(timediff( now() , eventLog.eventDate )) < :seconds"; 
sum
Şöyle yaparız.
@Query(value = "select p.client, sum(p.price) from PizzaOrder p group by p.client")
public List<?> topClients();
where kelimesi
Şöyle yaparız.
"from Inventory where inventoryId='I001'"