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.
- Używanie nazwy klasy zamiast nazwy tabeli.
- Użycie nazwy pola klasy zamiast nazwy kolumny tabeli.
- 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 User
nazwa klasy i user
nazwa 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ć, select
gdy 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.
GO TO FULL VERSION