HQL vs Criteria API

HQL (Hibernate Query Language) służy do budowania zapytań w hibernejcie. Sprawdzanie poprawności zapytania odbywa się w momencie wykonywania zapytania. Użycie zapytania HQL zostało przedstawione poniżej:

Configuration conf = new Configuration();
conf.configure("hibernate.cfg.xml");
conf.addAnnotatedClass(Company.class);
conf.addAnnotatedClass(CompanyDetail.class);
SessionFactory factory = conf.buildSessionFactory();
Session session = factory.getCurrentSession();

session.beginTransaction();

String sql = "from Company c where c.companyName = :companyName ";
Query<Company> query = session.createQuery(sql);
query.setParameter("companyName", "BIG Company 1");
Company company = query.getSingleResult();

System.out.println("obiekt istnieje w baze:");
System.out.println(company);

session.delete(company); 
System.out.println("obiekt skasowany.");

session.getTransaction().commit();
factory.close();



Criteria API to kolejny sposób na budowanie bardziej zaawansowanych zapytań do bazy. Tworzenie zapytań oparte jest w całości na obiektach na których wywołujemy specjalne metody. Dzięki takiemu podejściu sprawdzanie poprawności zapytania odbywa się w momencie kompilacji.

❗ od wersji Hibernate 5.2 wszystkie metody związane z  Criteria API są deprecated (przestarzała) i nie należy ich stosować. Zamiast tego należy używać JPA Criteria

Do  JPA Criteria należą:

  • CriteriaQuery
  • CriteriaUpdate
  • CriteriaDelete


❗ Aktualy stan w bazie danych:

1. tabela owner


1. tabela car



👉 Klasa testująca

package myhibernate.twodirection;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
import myhibernate.twodirection.entity.Car;
import myhibernate.twodirection.entity.Owner;

public class ReadOneToManyCriteriaApp {

public static void main(String[] args) {

Configuration conf = new Configuration();
conf.configure("hibernate.cfg.xml");
conf.addAnnotatedClass(Owner.class);
conf.addAnnotatedClass(Car.class);

SessionFactory factory = conf.buildSessionFactory();
Session session = factory.getCurrentSession();

session.beginTransaction();

CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<Owner> cr = cb.createQuery(Owner.class);
Root<Owner> root = cr.from(Owner.class);
cr.select(root).where(cb.like(root.get("fullName"),"Jan Kowalski"));

Query<Owner> query = session.createQuery(cr);
for(Owner owner : query.list()) {
System.out.println("Owner istnieje w baze:" + owner);

for(Car car : owner.getCars()) {
System.out.println("Car: " + car);
}
}

session.getTransaction().commit();
factory.close();
}
}

❗ Wynik działania w konsoli: 








Brak komentarzy:

Prześlij komentarz