1.1 Introduksjon til HQL

Tidligere ble du kjent med Hibernate, og nå vil jeg introdusere deg til HQL , også kjent som Hibernate Query Language . Faktisk er dette SQL-konvertert for å skrive spørringer i Hibernate. Den har flere viktige forskjeller.

  1. Bruke klassenavnet i stedet for tabellnavnet.
  2. Bruk av klassefeltnavnet i stedet for tabellkolonnenavnet.
  3. Valgfri bruk av select.

La oss be Hibernate returnere til oss alle brukerne som den har i databasen. Slik vil forespørselen se ut:

from User

Det er alt, til sammenligning presenterer vi en lignende spørring i SQL:

select * from user

Her Userer navnet på klassen, og userer navnet på tabellen.

Den komplette Java-koden vil se slik ut:


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

Ellers er HQL veldig lik SQL - den har også operatører:

  • WHERE
  • ORDER BY
  • GROUP BY
  • HAVING

1.2 Eksempel på arbeid med HQL

Kanskje det forrige eksemplet er litt forvirrende på grunn av de samme tabell- og feltnavnene. La oss komme med et spesielt eksempel hvor dette ville vært enklere.

La oss si at vi har en user_data- tabell som inneholder følgende felt:

  • ID INT
  • brukernavn VARCHAR(100)
  • brukernivå INT
  • user_created DATE

Vi vil lage en Java-klasse som vil kartlegge til denne tabellen:


@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;
}

La oss nå skrive noen eksempler:

HQL SQL
fra bruker velg * fra brukerdata
fra bruker der id=3 velg * fra user_data hvor id=3
fra bruker hvor nivå i (10,20,30) velg * fra brukerdata hvor brukernivå IN (10, 20, 30)
fra brukerordre etter opprettet asc velg * fra user_data order by user_created asc
fra bruker hvor navn som "test" velg * fra user_data der brukernavn som "test"

Spørringene er veldig like, og å lese HQL-spørringer når du er kjent med klassenavn og deres felt er like enkelt som å lese SQL-spørringer. Det kan være litt vanskeligere å skrive, men igjen, veldig komplekse spørringer skrives sjelden i HQL.

1.3 Bruk select

I HQL kan du bruke selectnår datatypen til resultatet ikke samsvarer med typen spesifisert i from.

For eksempel, vi ønsker å få navnene på alle brukerne som er i vår user_data- tabell , så må vi skrive følgende spørring:

select name from User

Også, hvis det er duplikater blant navnene, kan du bruke operatoren DISTINCT:

select distinct name from User

Aliaser fungerer på samme måte som i SQL:

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

Vel, helt i form av Java-kode, vil denne forespørselen se slik ut:

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 at spørringen må returnere en liste med navn. Navn er av typen String, så både typen av funksjonen og typeparameteren til Query-klassen er av typen String.