1.1 Introduzione a HQL
In precedenza, hai conosciuto Hibernate e ora ti presenterò HQL , noto anche come Hibernate Query Language . In effetti, questo è SQL convertito per scrivere query in Hibernate. Ha diverse differenze fondamentali.
- Usando il nome della classe invece del nome della tabella.
- Utilizzo del nome del campo della classe anziché del nome della colonna della tabella.
- Uso facoltativo di select.
Chiediamo a Hibernate di restituirci tutti gli utenti che ha nel database. Ecco come sarebbe la richiesta:
from User
Questo è tutto, per confronto, presentiamo una query simile in SQL:
select * from user
Ecco User
il nome della classe ed user
è il nome della tabella.
Il codice Java completo sarà simile a questo:
public List<User> getAllUsers() {
try (Session session = sessionFactory.openSession()) {
return session.createQuery("from User", User.class).list();
}
}
Altrimenti, HQL è molto simile a SQL - ha anche operatori:
WHERE
ORDER BY
GROUP BY
HAVING
1.2 Esempio di lavoro con HQL
Forse l'esempio precedente crea un po' di confusione a causa degli stessi nomi di tabella e campo. Facciamo un esempio speciale in cui questo sarebbe più facile.
Diciamo che abbiamo una tabella user_data che contiene i seguenti campi:
- id INT
- nome utente VARCHAR(100)
- livello_utente INT
- data_creata dall'utente
Creeremo una classe Java che verrà mappata a questa tabella:
@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;
}
Ora scriviamo alcuni esempi:
HQL | SQL |
---|---|
da Utente | selezionare * da user_data |
dall'utente dove id=3 | seleziona * da user_data dove id=3 |
da Utente dove livello in (10,20,30) | select * from user_data dove user_level IN (10, 20, 30) |
da Ordine utente da creato asc | select * from user_data order by user_created asc |
da Utente dove nome come 'test' | select * from user_data dove user_name piace 'test' |
Le query sono molto simili e leggere le query HQL quando si ha familiarità con i nomi delle classi e i loro campi è facile come leggere le query SQL. Potrebbe essere un po' più difficile da scrivere, ma anche in questo caso le query molto complesse raramente vengono scritte in HQL.
1.3 Utilizzo di selezionare
In HQL, puoi utilizzare select
quando il tipo di dati del risultato non corrisponde al tipo specificato in from
.
Ad esempio, vogliamo ottenere i nomi di tutti gli utenti presenti nella nostra tabella user_data , quindi dobbiamo scrivere la seguente query:
select name from User
Inoltre, se ci sono duplicati tra i nomi, puoi usare l'operatore DISTINCT
:
select distinct name from User
Gli alias funzionano come in SQL:
select distinct u.name from User u where u.created > '2020-01-01'
Bene, completamente sotto forma di codice Java, questa richiesta sarà simile a questa:
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();
}
}
Si noti che la query deve restituire un elenco di nomi. I nomi sono di tipo String, quindi sia il tipo della funzione che il parametro di tipo della classe Query sono di tipo String.
GO TO FULL VERSION