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.
- Använder klassnamnet istället för tabellnamnet.
- Använder klassfältsnamnet istället för tabellkolumnnamnet.
- 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 select
nä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.
GO TO FULL VERSION