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.
- Az osztálynév használata a tábla neve helyett.
- Az osztály mező nevének használata a táblázat oszlopának neve helyett.
- 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 User
van az osztály neve, és user
a 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ó, select
ha 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ú.
GO TO FULL VERSION