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