1.1 Introduktion till HQL

Tidigare har du bekantat dig med Hibernate, och nu kommer jag att presentera dig för HQL , aka Hibernate Query Language . Faktum är att detta är SQL-konverterat för att skriva frågor i Hibernate. Den har flera viktiga skillnader.

  1. Använder klassnamnet istället för tabellnamnet.
  2. Använder klassfältsnamnet istället för tabellkolumnnamnet.
  3. Valfri användning av select.

Låt oss be Hibernate att skicka tillbaka alla användare som den har i databasen. Så här skulle begäran se ut:

from User

Det är allt, för jämförelse presenterar vi en liknande fråga i SQL:

select * from user

Här Userär namnet på klassen, och userär namnet på tabellen.

Hela Java-koden kommer att se ut så här:


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

Annars är HQL väldigt lik SQL - den har också operatorer:

  • WHERE
  • ORDER BY
  • GROUP BY
  • HAVING

1.2 Exempel på att arbeta med HQL

Kanske är det föregående exemplet lite förvirrande på grund av samma tabell- och fältnamn. Låt oss komma med ett speciellt exempel där detta skulle vara lättare.

Låt oss säga att vi har en user_data- tabell som innehåller följande fält:

  • id INT
  • användarnamn VARCHAR(100)
  • user_level INT
  • user_created DATE

Vi kommer att skapa en Java-klass som mappar till denna tabell:


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

Låt oss nu skriva några exempel:

HQL SQL
från Användare välj * från user_data
från användare där id=3 välj * från user_data där id=3
från User where level in (10,20,30) välj * från user_data där user_level IN (10, 20, 30)
från Användarorder efter skapad asc välj * från user_data order by user_created asc
från användare där namn som "test" välj * från user_data där användarnamn som "test"

Frågorna är väldigt lika, och att läsa HQL-frågor när du är bekant med klassnamn och deras fält är lika enkelt som att läsa SQL-frågor. Det kan vara lite svårare att skriva, men återigen, mycket komplexa frågor skrivs sällan i HQL.

1.3 Använd select

I HQL kan du använda selectnär datatypen för resultatet inte matchar den typ som anges i from.

Till exempel vill vi få namnen på alla användare som finns i vår user_data- tabell , då måste vi skriva följande fråga:

select name from User

Dessutom, om det finns dubbletter bland namnen, kan du använda operatorn DISTINCT:

select distinct name from User

Alias ​​fungerar på samma sätt som i SQL:

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

Tja, helt i form av Java-kod kommer denna begäran att se ut så här:

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();
    }
}

Observera att frågan måste returnera en lista med namn. Namn är av typen String, så både typen av funktion och typparametern för Query-klassen är av typen String.