1.1 Wprowadzenie do HQL

Wcześniej poznałeś Hibernate, a teraz przedstawię Ci HQL , czyli Hibernate Query Language . W rzeczywistości jest to przekonwertowany język SQL do pisania zapytań w Hibernate. Ma kilka kluczowych różnic.

  1. Używanie nazwy klasy zamiast nazwy tabeli.
  2. Użycie nazwy pola klasy zamiast nazwy kolumny tabeli.
  3. Opcjonalne użycie select.

Poprośmy Hibernate, aby zwrócił nam wszystkich użytkowników, których ma w bazie danych. Oto jak wyglądałoby to żądanie:

from User

To wszystko, dla porównania przedstawiamy podobne zapytanie w SQL:

select * from user

Oto Usernazwa klasy i usernazwa tabeli.

Cały kod Java będzie wyglądał następująco:


public List<User> getAllUsers() {
    try (Session session = sessionFactory.openSession()) {
            return session.createQuery("from User", User.class).list();
    }
}

Poza tym HQL jest bardzo podobny do SQL - ma też operatory:

  • WHERE
  • ORDER BY
  • GROUP BY
  • HAVING

1.2 Przykład pracy z HQL

Być może poprzedni przykład jest nieco mylący ze względu na te same nazwy tabel i pól. Wymyślmy specjalny przykład, w którym byłoby to łatwiejsze.

Załóżmy, że mamy tabelę user_data zawierającą następujące pola:

  • identyfikator INT
  • nazwa użytkownika VARCHAR(100)
  • poziom_użytkownika INT
  • użytkownik_utworzony DATA

Stworzymy klasę Java, która będzie mapować do tej tabeli:


@Entity
@Table(name="user_data")
class User {
   @Id
   @GeneratedValue
   public Integer id;
 
   @Column(name="user_name")
   public String name;
 
   @Column(name="user_level")
   public Integer level;
 
   @Column(name="user_created")
   public Date created;
}

Teraz napiszmy kilka przykładów:

HQL SQL
od Użytkownika wybierz * z user_data
od Użytkownika, gdzie id=3 wybierz * z user_data gdzie id=3
od Użytkownika, gdzie poziom w (10,20,30) wybierz * z user_data gdzie user_level IN (10, 20, 30)
z zamówienia użytkownika utworzonego przez asc wybierz * z user_data order przez user_created asc
od użytkownika, gdzie nazwa taka jak „test” wybierz * z danych_użytkownika, gdzie nazwa_użytkownika, jak „test”

Zapytania są bardzo podobne, a odczytywanie zapytań HQL, gdy znasz nazwy klas i ich pola, jest równie łatwe, jak odczytywanie zapytań SQL. Pisanie może być trochę trudniejsze, ale z drugiej strony bardzo złożone zapytania rzadko są pisane w HQL.

1.3 Korzystanie z wybierz

W HQL możesz użyć, selectgdy typ danych wyniku nie pasuje do typu określonego w from.

Na przykład chcemy uzyskać nazwy wszystkich użytkowników, którzy są w naszej tabeli user_data , a następnie musimy napisać następujące zapytanie:

select name from User

Ponadto, jeśli wśród nazw znajdują się duplikaty, możesz użyć operatora DISTINCT:

select distinct name from User

Aliasy działają tak samo jak w SQL:

select distinct u.name from User u where u.created > '2020-01-01'

Cóż, całkowicie w formie kodu Java, to żądanie będzie wyglądać tak:

public List<String> getUserNames() {
    try (Session session = sessionFactory.openSession()) {
            String hql = "select distinct u.name from User u where u.created > '2020-01-01'";
            Query<String> query = session.createQuery(hql , String.class);
            return query.list();
    }
}

Zauważ, że zapytanie musi zwrócić listę nazwisk. Nazwy są typu String, więc zarówno typ funkcji, jak i parametr typu klasy Query są typu String.