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.

  1. De klassenaam gebruiken in plaats van de tabelnaam.
  2. De klasseveldnaam gebruiken in plaats van de tabelkolomnaam.
  3. 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 Useris de naam van de klasse en userde 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 selectwanneer 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.