1.1 Inleiding tot HQL
Eerder maakte je kennis met Hibernate, en nu zal ik je kennis laten maken met HQL , oftewel Hibernate Query Language . In feite is dit SQL geconverteerd voor het schrijven van query's in Hibernate. Het heeft een aantal belangrijke verschillen.
- De klassenaam gebruiken in plaats van de tabelnaam.
- De klasseveldnaam gebruiken in plaats van de tabelkolomnaam.
- Optioneel gebruik van selecteren.
Laten we Hibernate vragen om alle gebruikers die het in de database heeft naar ons terug te sturen. Dit is hoe dat verzoek eruit zou zien:
from User
Dat is alles, ter vergelijking presenteren we een vergelijkbare query in SQL:
select * from user
Hier User
is de naam van de klasse en user
de naam van de tabel.
De volledige Java-code ziet er als volgt uit:
public List<User> getAllUsers() {
try (Session session = sessionFactory.openSession()) {
return session.createQuery("from User", User.class).list();
}
}
Anders lijkt HQL erg op SQL - het heeft ook operators:
WHERE
ORDER BY
GROUP BY
HAVING
1.2 Voorbeeld van werken met HQL
Misschien is het vorige voorbeeld een beetje verwarrend vanwege dezelfde tabel- en veldnamen. Laten we een speciaal voorbeeld bedenken waar dit gemakkelijker zou zijn.
Laten we zeggen dat we een user_data- tabel hebben die de volgende velden bevat:
- id INT
- gebruikersnaam VARCHAR(100)
- gebruiker_niveau INT
- gebruiker_gecreëerde DATE
We zullen een Java-klasse maken die naar deze tabel wordt toegewezen:
@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;
}
Laten we nu enkele voorbeelden schrijven:
hoofdkwartier | SQL |
---|---|
van Gebruiker | selecteer * uit user_data |
van Gebruiker waar id=3 | selecteer * uit user_data waar id=3 |
van gebruiker waar niveau in (10,20,30) | selecteer * uit user_data waar user_level IN (10, 20, 30) |
van Gebruikersvolgorde door gecreëerde asc | select * from user_data order by user_created asc |
van Gebruiker waar naam als 'test' | selecteer * uit user_data waarbij gebruikersnaam zoals 'test' |
De query's lijken erg op elkaar en het lezen van HQL-query's als u bekend bent met klassennamen en hun velden, is net zo eenvoudig als het lezen van SQL-query's. Het is misschien iets moeilijker om te schrijven, maar aan de andere kant worden zeer complexe queries zelden in HQL geschreven.
1.3 Selecteren gebruiken
In HQL kunt u gebruiken select
wanneer het gegevenstype van het resultaat niet overeenkomt met het type dat is opgegeven in from
.
We willen bijvoorbeeld de namen krijgen van alle gebruikers die in onze user_data- tabel staan , dan moeten we de volgende query schrijven:
select name from User
Als er duplicaten zijn tussen de namen, kunt u ook de operator gebruiken DISTINCT
:
select distinct name from User
Aliassen werken hetzelfde als in SQL:
select distinct u.name from User u where u.created > '2020-01-01'
Welnu, volledig in de vorm van Java-code, ziet dit verzoek er als volgt uit:
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();
}
}
Merk op dat de query een lijst met namen moet retourneren. Namen zijn van het type String, dus zowel het type van de functie als de parameter type van de klasse Query zijn van het type String.
GO TO FULL VERSION