1.1 Bevezetés a HQL-be

Korábban megismerkedtél a hibernálással, most pedig a HQL-t , más néven Hibernate Query Language-t mutatom be . Valójában ez az SQL, amelyet lekérdezések hibernált üzemmódban történő írására alakítottak át. Számos lényeges különbség van benne.

  1. Az osztálynév használata a tábla neve helyett.
  2. Az osztály mező nevének használata a táblázat oszlopának neve helyett.
  3. Választható használata.

Kérjük meg a Hibernate-t, hogy küldje vissza nekünk az adatbázisban szereplő összes felhasználót. Így nézne ki a kérés:

from User

Ez minden, összehasonlításképpen bemutatunk egy hasonló lekérdezést SQL-ben:

select * from user

Itt Uservan az osztály neve, és usera tábla neve.

A teljes Java kód így fog kinézni:


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

Egyébként a HQL nagyon hasonlít az SQL-re – operátorai is vannak:

  • WHERE
  • ORDER BY
  • GROUP BY
  • HAVING

1.2 Példa a HQL-lel való munkára

Talán az előző példa egy kicsit zavaró az azonos tábla- és mezőnevek miatt. Jöjjön egy speciális példa, ahol ez egyszerűbb lenne.

Tegyük fel, hogy van egy user_data táblánk , amely a következő mezőket tartalmazza:

  • azonosító INT
  • felhasználónév VARCHAR(100)
  • felhasználói_szint INT
  • user_created DATE

Létrehozunk egy Java osztályt, amely ehhez a táblázathoz lesz leképezve:


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

Most írjunk néhány példát:

HQL SQL
Felhasználótól válassza a *-ot a user_data közül
felhasználótól ahol id=3 válassza ki a *-ot a user_data-ból, ahol id=3
felhasználótól, ahol szint (10,20,30) válassza ki a *-ot a user_data közül, ahol user_level IN (10, 20, 30)
from User order by Created asc válassza a *-ot a user_data sorrendből a user_created asc szerint
a felhasználóból, ahol a név, például "teszt" válasszon *-ot a user_data közül, ahol a felhasználónév, például a "teszt"

A lekérdezések nagyon hasonlóak, és a HQL-lekérdezések olvasása, ha ismeri az osztályneveket és azok mezőit, ugyanolyan egyszerű, mint az SQL-lekérdezések olvasása. Lehet, hogy kicsit nehezebb megírni, de a nagyon összetett lekérdezéseket ritkán írják le HQL-ben.

1.3 A Select gombbal

A HQL-ben akkor használható, selectha az eredmény adattípusa nem egyezik a -ban megadott típussal from.

Például meg akarjuk kapni az összes felhasználó nevét, akik a user_data táblánkban szerepelnek , majd meg kell írnunk a következő lekérdezést:

select name from User

Továbbá, ha a nevek között ismétlődések vannak, akkor használhatja az operátort DISTINCT:

select distinct name from User

Az álnevek ugyanúgy működnek, mint az SQL-ben:

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

Nos, teljesen Java kód formájában ez a kérés így fog kinézni:

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

Vegye figyelembe, hogy a lekérdezésnek névlistát kell visszaadnia. A nevek String típusúak, tehát mind a függvény típusa, mind a Query osztály típusparamétere String típusú.