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.

  1. Usando il nome della classe invece del nome della tabella.
  2. Utilizzo del nome del campo della classe anziché del nome della colonna della tabella.
  3. 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 Useril 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 selectquando 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.