You are on page 1of 30

1

Hibernate
Mc lc
Contents
1. Khi nim............................................................................................................ 3
1.1 ORM Framework .......................................................................................... 3
1.2 Persistence Layer ........................................................................................... 3
1.3 Hibernate Framework .................................................................................... 4
2. Ci t v s dng ............................................................................................. 5
2.1 Ci t ............................................................................................................ 5
2.2 S dng .......................................................................................................... 5
3. Cc tp tin config ............................................................................................... 6
3.1 hibernate.cfg.xml ........................................................................................... 6
3.2 Hibernate.properties ...................................................................................... 7
4. Tp tin hbm.xml tp tin nh x ..................................................................... 8
4.1 Cu trc c bn .............................................................................................. 8
4.2 Mapping types ............................................................................................... 9
4.3 Mapping collection of value types (s dng bag) .......................................11
4.4 Mapping Entity Association ........................................................................12
4.5 Cascading action ..........................................................................................13
5. org.hibernate.cfg.Configuration .....................................................................14
5.1 Configure() ..................................................................................................14
5.2 addResource(String path) ............................................................................14
5.3 addClass(java.lang.Class class) ...................................................................14
5.4 setProperties(java.util.Properties) ...............................................................14
2

6. org.hibernate.Session .......................................................................................14
6.1 Cch s dng ...............................................................................................14
6.2 Rt trch mt persistence object bng id .....................................................15
6.3 lock() ............................................................................................................15
6.4 Updating persistence objects .......................................................................16
6.5 Insert ............................................................................................................17
6.6 Delete ...........................................................................................................18
6.7 Ngoi l ConstraintViolationException ......................................................19
7. Transaction .......................................................................................................19
7.1 Understanding database transactions ..........................................................19
7.2 JDBC v JTA transactions ..........................................................................19
7.3 Hibernate Transaction API ..........................................................................20
8. HQL ...................................................................................................................22
8.1 Mnh from ..............................................................................................22
8.2 Mnh as ...................................................................................................24
8.3 Cc lin kt ca i tng ...........................................................................25
8.4 Mnh select .............................................................................................27
8.5 Cc hm tp hp ca HQL ..........................................................................27
8.6 Mnh where ............................................................................................27
8.7 Mnh order by v group by ....................................................................30





3

1. Khi nim
1.1 ORM Framework
Framework l mt khi nim trong pht trin phn mm dng
ch nhng cu trc h tr c nh ngha m trong
nhng d n phn mm khc c th c sp xp vo v
pht trin.
ORM (Object Relational Mapping) framework l mt c ch
cho php ngi lp trnh thao tc vi database mt cch hon
ton t nhin thng qua cc i tng. Lp trnh vin hon
ton khng quan tm n loi database s dng, SQL,
1.2 Persistence Layer
Tier v Layer: tier thng c gn vi phn cng v mt
vt l (physical) cn layer th dnh n vn cch thc t
chc bn trong ca ng dng. Vic phn chia tier l trong
sut (transparent) i vi ng dng v mt lun l (logical).
iu ny c ngha l khi ta pht trin mt ng dng, chng ta
khng bn tm n cc thnh phn (component) s trin khai
(deploy) ra sao m ch ch l chng ta s t chc ng dng
thnh nhng layer nh th no.
Peristence layer: mt ng dng c th c chia lm 3 phn
nh sau: giao din ngi dng (presentation layer), phn x l
nghip v (business layer) v phn cha d liu (data layer).
C th ra, business layer c th c chia nh thnh 2 layer
con l business logic layer (cc tnh ton nhm tha mn yu
cu ngi dng) v persistence layer. Persistence layer chu
trch nhim giao tip vi data layer (thng l mt h qun tr
c s d liu quan h - Relational DBMS). Persistence s m
4

nhim cc nhim v m kt ni, truy xut v lu tr d liu
vo cc Relational DBMS.

1.3 Hibernate Framework
Hibernate l mt trong nhng ORM Framework
Hibernate framework l mt framework cho persistence layer.
Nh vy, nh c Hibernate framework m gi y khi bn
pht trin ng dng bn ch cn ch tm vo nhng layer khc
m khng phi bn tm nhiu v persistence layer na.
Hibernate: l mt dch v lu tr v truy vn d liu quan h
mnh m v nhanh.
Hibernate gip bn pht trin cc class dng lu tr d liu
theo cch thc hng i tng: association, inheritance,
polymorphism, composition v collections
Hibernate cho php bn thc hin cc cu truy vn d liu
bng cch s dng ngn ng SQL m rng ca Hibernate
(HQL) hoc l ngn ng SQL nguyn thy cng nh l s
dng cc API.
Hibernate c license theo LGPL (Lesser GNU Public
License).
Theo , bn c th thoi mi s dng Hibernate trong cc d
n open source hoc cc d n thng mi (commercial).




5

2. Ci t v s dng
2.1 Ci t
Vic ci t Hibernate rt n gin. Hibernate c build
thnh 1 tp tin JAR. Bn ch cn download tp tin ny v lu
n vo th mc LIB ca project m bn ang pht trin.
Download JDBC Driver cho database (cng c build thnh
1 tp tin JAR).
Thm cc thnh phn lin quan ca Hibernate vo classpath.

2.2 S dng
Vic s dng Hibernate cng rt n gin. Bn cn g mt
persistence layer? l chng s truy xut cng nh lu tr d liu
ca bn xung database. V mt vt l, theo m hnh d liu quan
h, d liu ca bn s bao gm cc thc th (entity) c quan h vi
nhau. V khi hin thc c th hn mc database, chng s c i
din bi cc table, bi cc rng buc kha ngoi, kha chnh,
Hibernate cng nh vy.
Mi table trong database l mt object trong Hibernate. Do , bn
cn c mt java bean cho mi table trong database. Cc java bean
ny s c cc getters / setters v mt s ngoi l theo quy c ca
Hibernate.
Tip theo Hibernate bit mt object c nh x (mapping)
nh th no vi table trong database, Hibernate yu cu bn cung
cp tp tin c t gi l mapping file. Theo quy c ca Hibernate,
cc mapping file ny c ui l .hbm.xml v phi hp l vi DTD
(Document Type Definition) m Hibernate a ra. Trong cc
mapping file ny, bn s c t cc mi quan h gia property ca
6

object vi field ca table. Tc l bn gip cho Hibernate hiu mi
quan h gia cc object tng ng nh th no vi mi quan h
gia cc field.
Tip theo, bn cn c 1 tp tin Hibernate bt u:
hibernate.cfg.xml. C th ni tp tin ny c load ln u tin khi
bn khi ng Hibernate. Bn c t cc thng tin sau:
- SQL Dialects.
- JDBC connection property: connection (url, driver class name,
user name, password, pool size).
- Hoc l datasource property: datasource JNDI name, user
name, password.
- Hibernate configuration: show sql,
- Hibernate cache configuration.
- Hibernate transaction configuration.
- Miscellaneous configuration.

3. Cc tp tin config
3.1 hibernate.cfg.xml
Tp tin ny bt u bng th <hibernate-configuration> v kt
thc vi th </hibernate-configuration>.
Th <session-factory> l th con ca th <hibernate-
configuration>. Nhng th con ca th <session-factory> c
s dng nh ngha properties v resources ca session-
factory.
nh ngha cc properties ca session-factory, ta s dng
th <property name=>class</property>.
7

- name ca th property l property ca session-factory.
Nhng properties ca session-factory c th l:
o hibernate.connection.driver_class
o hibernate.connection.url
o hibernate.connection.username
o hibernate.connection.password
o hibernate.connection.pool_size
o show_sql
o Dialect
o hibernate.hbm2ddl.auto
o

- class l cc gi tr ca cc properties ca session-factory.
o V d:
<property
name=hibernate.connection.driver_class>
com.mysql.jdbc.Driver
</property>
- nh ngha resouces ca session-factory, ta s dng
<mapping resource=/>
o resource l ng dn url ca hbm.xml file.

3.2 Hibernate.properties
Khai bo cc properties trong 1 file tn l: hibernate.properties, ch cn
t file ny trong classpath ca ng dng. N s t kim tra v c khi
Hibernate khi chy ln u tin, l khi tao 1 Configuaration object.
Tng t nh hibernate.cfg.xml, hibernate.properties cng khai bo
8

cc thng s, nhng hibernate.properties thng c kt hp vi spring
config.
4. Tp tin hbm.xml tp tin nh x
4.1 Cu trc c bn
Bt u bng <hibernate-mapping> v kt thc vi
</hibernate-mapping>.
Tng bng trong CSDL c inh ngha bng th <class> v
cha nhng thuc tnh (attributes):
- name: l tn ca lp i tng d liu (data object class)
(ca bng tng ng trong CSDL).
- table: l tn ca bng trong CSDL.
Th <class> c cc th con sau:
- Th <id>: nh ngha id ca bng. N c nhng thuc
tnh sau:
o name: l tn property ca i tng d liu (data
object).
o column: l tn ca ct trong CSDL.
o type: l kiu d liu ca ct. Ch : y l mt kiu
ca Hibernate ch khng phi ca kiu d liu ca
Java hay ca CSDL.
- Th <id> cng c th con sau:
- Th <generator class=> cho bit loi id trong table
ca CSDL (c gn l: no-generate, increment: c
to ra bi hibernate (khng nn s dng), identity: t
ng to ra bi CSDL, native: chn cc kiu to khc
nh sequence ca Oracle.
9

- Th <property> ch ra mt ct bnh thng, c cng
thuc tnh nh th <id> ngoi tr vic th ny khng c
th con <generator>.

4.2 Mapping types
Mapping types l nhng kiu d liu m khi khai bo tp
tin hbm.xml s dc nh x tng ng. Hibernate c mt s
kiu d liu sn c m Hibernate nh ngha, goi l Built-
in mapping types. Ngoi ra, bn cng c th t nh ngha
mt kiu ring ca bn.
Bn cng nn ch rng c s d liu ca bn c th s
khng h tr mt vi SQL types trn. Danh sch trn ch
l ANSI-standard data types.
Tuy nhin, JDBC driver cung cp vendor-specific SQL data
types, cho php Hibernate lm vic vi ANSI-standard types
khi thc thi cu lnh DML (data manipulation language). i
vi DDL, Hibernate dch ANSI-standard type thnh vendor-
specific type bng cch s dng c t SQL dialects.
java.sql.Blob v java.sql.Clob l cch hiu qu nht qun
l large object trong Java.
Tuy nhin, do hn ch l Blob v Clob ch c th s dng cho
n khi JDBC transaction hon tt, nn ngi ta thng s
dng binary hay text mapping type.
Ch : bn c th kim ci mu mi nht (design pattern) v
hng dn s dng large object trn website ca Hibernate.
<class name="vn.huflit.diendan.model.Forum" table="FORUM">
<id
10

name="id"
type="java.lang.Long"
unsave-value="null" >
<column
name="FORUM_ID"
not-null="true"
sql-type="INTEGER"
/>
<generator class="identity">
</generator>
</id>
<property
name="forumSubject"
type="java.lang.String"
update="true"
insert="true"
>
<column
name="FORUM_SUBJECT"
not-null="true"
sql-type="VARCHAR(50)"
/>
</property>
<!
Tiep tuc...
-->
</class>
11

4.3 Mapping collection of value types (s dng bag)
Trong trng hp ta c CSDL nh trn, mt FORUM thuc mt
CAT v mt CAT c nhiu FORUM.
Vy nn, trong CAT c danh sch FORUM, nh vy trong Class
Category c mt thuc tnh forumList, v ta s nh x forumList nh
th no.
Ta s s dng th bag lm cng vic ny trong tp tin mapping
ca CAT:
<bag
name="forumList"
lazy="true"
cascade="save-update"
>
<key
column="CAT_ID"
>
</key>

<one-to-many
class="vn.huflit.diendan.model.Forum"
/>
</bag>




12

4.4 Mapping Entity Association
Thng c 4 dng kt hp l: one-to-one, many-to-many, one-
to-many, many-to-one, nhng thng th ta ch s dng 2 loi
kt hp: one-to-many v many-to-one.
- One-to-many
o Nh v d phn trn, mt FORUM thuc mt CAT v
mt CAT cha nhiu FORUM, nn trong CAT c
thuc tnh forumList.
o i vi mi phn t trong forumList s thuc mt
CAT, v vy, quan h gia CAT vi nhng phn t
ny l one-to-many.
o Ta dng th <one-to-many> nm trong lp Category
(trong th bag) cho bit Category c nhiu phn t
nm trong forumList v mi phn t chnh l mt
th hin ca Forum.
o V d (xem phn Mapping collection of value types)

- Many-to-one
o th hin rng mt TOPIC thuc mt FORUM, v
cng c th mt th hin khc ca TOPIC cng thuc
FORUM trn, ta s s dng th <many-to-one> trong
tp tin nh x ca TOPIC.
o V d:
<many-to-one
name="forumId"
class="vn.huflit.diendan.model.Forum"
13

cascade="none"
outer-join="auto"
update="true"
insert="true"
>
<column
name="FORUM_ID"
not-null="true"
sql-type="INTEGER"
/>
</many-to-one>
4.5 Cascading action
V cc thuc tnh cascade trong cc th bn trn, ngha n
tng t nh cc ty chn cascade trong cc h qun tr CSDL
m ta tng bit nh Ms Access, SQL Server, Oracle, ... Cc
gi tr ca cascade:
- "none": khng thc hin g c, t ta kim tra cc rng
buc v thc hin cho ng trnh ngoi l.
- "save-update": lu v cp nht cha s c cp nht c
con.
- "delete": xa cha th s thc hin xa c con.
- "all": tt c hnh ng bao gm "save-update" hay
"delete" u c thay i con nu c thay i t cha
- "all-delete-orphan": tt c hnh ng s c cp nht t
cha n con, nhng con khng cn cha s b xa.
Thng th, save-update l mt la chn tt nht v d xi.

14

5. org.hibernate.cfg.Configuration
5.1 Configure()
S dng cc php nh x (mappings) v cc c tnh c xc
nh (properties specified) trong mt ti nguyn ng dng
(application resource) c t tn l hibernate.cfg.xml. Nhiu
ngi thch tp trung cu hnh Hibernate bng cch ny thay v
thm tham s vo Configuration trong code ca ng dng.
5.2 addResource(String path)
c cc mappings trong mt application resource (s dng ci
ny khi khng mun s dng file .cfg.xml config).
5.3 addClass(java.lang.Class class)
c mapping files ca class u vo (v d, c lp User and v c
User.hbm.xml, khi s dng addClass(User.class) ngha l thm
User.hbm.xml resource file vo Configuration
5.4 setProperties(java.util.Properties)
Ta c th class, driver, user, password (,) truy cp vo
database bng cch s dng .cfg.xml file hoc .properties file.
Khi s dng .properties file, phi s dng phng thc ny
config.
6. org.hibernate.Session
6.1 Cch s dng
//open a session
Session session = sessionFactory.openSession();
//begin a transaction
Transaction tx = session.beginTransaction();
//
//do sth with session here
15

//

//commit
tx.commit();
//close session
session.close();

6.2 Rt trch mt persistence object bng id
V d ly ra mt user bng id:
User user = session.get(User.class, new Long(100));Nu chng
ta s dung phng thc ny ly User vi cng id trong cng
session, phng thc ny s tr v mt instance ca User
(khng phi 2 instance).
V d:
User user1 = session.get(User.class, new Long(100));
User user2 = sessoon.get(User.class, new Long(100));
=> user1= user2

Ta c th rt trch bng phng thc load(). S khc bit gia
phng thc load() v get() l ta c th khng rt trinh mt i
tng c tr v bi phng thc load() khi session b
ng (close).
6.3 lock()
Sau khi ly mt i tng t CSDL, ta ng session li. Ci
vic ny s lm cho i tng tr thnh intacnce b tch bit
16

(detached instance). N c th c kt hp li (reassociated)
vi Session mi bng cch gi lock(). Phng thhc ny s
nm ra mt ngoi l l HibernateException khi n khng th
tm thy id trong CSDL bng vi id ca i tng.
HibernateException cng s b nm khi bn thay i id ca i
tng sau khi kt hp li.
V d:
Session session = sessionFactory.openSession();
User user = (User) session.get(User.class, new Long(100));
Session.close();
//user becomes detached
Session session2 = sessionFactory.openSession();
//anotherSession
session2.lock(user, LockMode.NONE); //reassociated

6.4 Updating persistence objects
Cc i tng c rt trch bi phng thc session.load() hay
session.get() c kt hp vi CSDL. Chng ta ch cn set
nhng gi tr mi v commit ci transaction update. Objects that
are reassociated are also the same.
V d:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
User user = (User) session.get(User.class, new Long(100));
user.setName(ABC);
tx.commit();
session.close();
17

Detached objects c th thng c cp nht bi phng thc
update(). Cc i tng c cp nht cng c kt hp li
vi session mi.
V d:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
User user = (User) session.get(User.class, new Long(100));
user.setName(ABC);
tx.commit();
session.close();
// pretend that user has 2 properties, first is
// name, second is password; and the values by
// roster are AAA and BBB.
user.setName(ABC);//new name value
Session session2 = sessionFactory.openSession();
tx = session2.beginTransaction();
session2.update(user); //update and reassociated
user.setPassword(EFG);
tx.commit();
session2.close();

//the new values of user in turn of name and password are
ABC and EFG
Mt StaleStateException s c nm khi ta cp nht mt i
tng khng tn ti.

6.5 Insert
18

insert mt i tng vo CSDL, ta s dng phng thc save().
Sau khi gi phng thc ny, i tng s c kt hp li vi
session.
V d:
User user = new User();
user.setId(120);
user.setName(Name);
user.setPassword(Password);
Session session = sessionFactory.openSession();
Transaction tx = Session.beginTransaction();
session.save(user);
user.setName(NewName);
tx.commit();
session.close();
/* after executing the code above, in database, there is a row containing
values as follow: id = 120, name = NewName, password =
Password */

6.6 Delete
delete mt dng trong CSDL, ta phi a ra mt i tng tng
ng vi bng trong CSDL. Nhng ta khng cn phi a ht gi tr vo
cc thuc tnh ca i tng, ta ch cn set ci id ca i tng.
Phng thc ny s nm ra mt ngoi l (StaleStateException) khi ta
mun xa mt i tng c id m id ny ko tn ti trong CSDL.

V d:
User user = new User();
User.setId(100);
Session session = sessionFactory.openSession();
19

Transaction tx = session.beginTransaction();
session.delete(user);
tx.commit();
session.close();

6.7 Ngoi l ConstraintViolationException
Khi bn c gng save, update, delete nhng i tng m s xm
phm cc rng buc CSDL (nh duplicate identifier, not-null
constraint, unique constraint), ngoi l ConstraintViolationException
s c nm ra.
7. Transaction
7.1 Understanding database transactions
Mt database transaction nhm cc thao tc truy cp d liu. Mt
transaction s kt thc bng mt trong 2 cch sau y: committed hoc
rolled back.
Nu c nhiu thao tc d liu c thc thi trong mt transaction, bn
phi nh du chc chn cho tng cng vic. Bn phi start transaction,
v 1 vi thi im, phi commit nhng thay i. Nu c li xy ra
(trong qu trnh thc thi cc thao tc hay trong lc ang commit nhng
thay i), bn phi roll back transaction a d liu tr v tnh trng
thch hp. Vic ny cn c gi l transaction demarcation.
Minh ha: tnh trng trong qu trnh ca mt transaction

7.2 JDBC v JTA transactions
Trong mi trng non-managed, JDBC API thng nh du cc giao
tc. Bn bt u mt transaction bng cch gi setAutoCommit(false)
trong JDBC connection v kt thc n bng cch gi commit(). i khi,
20

bn mun p n rollback ngay lp tc th c th lm bng cch gi
rollback().
Trong h thng lu tr d liu trn nhiu c s d liu, mt cng vic c
th truy cp n nhiu hn 1 kho d liu. Trong trng hp ny, bn
khng th ch s dng JDBC mt mnh.
Bn cn phi c mt transaction manager m h tr transaction phn b.
Bn c th lin lc vi transaction manager bng cch s dng JTA.
Trong mi trng managed, JTA khng ch s dng cho transaction
phn b m cn s dng cho container managed transactions (CMT).
CMT cho php bn ngn nga c nhng transaction gi trong source
code ca ng dng.
Hibernate tc ng ti database thng qua JDBC Connection. V th n
h tr c APIs. Trong mt ng dng n l, ch cn JDBC transaction l
, cn trong mt ng dng server th Hibernate c th s dng JTA
transaction. Nh vy, code Hibernate ging c 2 mi trng managed v
non-managed. Hibernate cung cn nhng lp tru tng bn ca n,
c du bn di transaction API. Hibernate cho php ngi s dng
m rng bng cch a thm vo CORBA transaction service.
7.3 Hibernate Transaction API
Transaction interface cung cp nhng phng thc cho mt database
transaction. Xem v d c bn di y:

Session session = session.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
21

concludeAuction();
tx.commit();
} catch (Exception e) {
if (tx != null) {
try {
tx.rollback();
}catch (HibernateException he) {
// log he and rethrow e
}
}
throw e;
} finally {
try {
session.close();
} catch (HibernateException he) {
throw he;
}
}
Vic gi session.beginTransaction() l nh du im bt u ca mt mt
database transaction. Trong trng hp l mi trng non-managed th
JDBC transaction s bt u trn JDBC connection. Cn trong mi trng
managed, n s bt u mt JTA transaction mi nu cha c tn ti JTA
transaction, hoc l kt hp vi JTA transaction tn ti. Tt c vic ny
u c qun l bi Hibernate, nn bn khng cn phi quan tm n vn
n ny.
Vic gi tx.commit() ng thi thay i tnh trng Session i vi c s
d liu. Hibernate s commit transaction bn di khi v ch khi
beginTransaction() bt u mt transaction mi. Nu beginTransaction()
22

khng bt u mt transaction bn di mi, commit() ch thay i tnh
trng Session i vi c s d liu.
Nu concludeAuction() nm ra mt ngoi l, chng ta phi p buc
transaction rollback bng cch gi tx.rollback().

8. HQL
HQL l mt thay th tuyt vi cho SQL khi bn ang pht trin ng dng hng
i tng tng tc vi mt c s d liu quan h thng qua Hibernate.
HQL khng phi l mt thay th cho SQL. Thay vo , n cho php chng ta th
hin cc truy vn di hnh thc hng i tng. Khi mt biu thc HQL c thc
thi, u tin n chuyn i thnh mt cu lnh SQL, SQL c to ra sau c
thc hin i vi c s d liu, kt qu c t trong cc i tng lin tc, v cc
i tng c tr li cho ng dng. Hnh di y m t kch bn ny:


8.1 Mnh from
Hnh thc n gin ca n, mt biu thc HQL bao gm mt mnh
from kt thc l tn ca mt lp persistent c th. Di y l mt v d:
from Teacher
Biu thc HQL ny c s dng truy vn tt c cc thc th ca lp
Teacher.
23

K t khi auto-import l mc nh trong cc file mapping (xem th
<hibernate-mapping>), lp Teacher khng cn phi th hin vi hnh thc
tiu chun. Trong nhng trng hp ni cc classnames trng lp trong
ng dng, classnames trng nhau phi c xc nh vi hnh thc tiu
chun.
thc thi mt biu thc HQL, mt thc th org.hibernate.Query l u
tin c to bng cch gi phng thc createQuery() ca Session nh
sau:

public Query createQuery(String hqlQuery) throws
HibernateException|

Ch i s String duy nht ca phng thc ny l biu thc HQL.
Kiu tr v Query cung cp nhiu phng thc xc nh nhng
hn ch v kt qu, thc thi truy vn, v c c kt qu truy vn. N cng
c nhng phng thc khc thit lp tn cc gi tr tham s, thm ch
thch n Hibernate-generated SQL, thit lp JDBC timeout v ly size
JDBC, v di chuyn kt qu. Chng ta s xem sau v phn ny.
Sau khi bn to v chun b thc th Query, bn c th gi phng thc
list() thc thi truy vn i vi c s d liu v ly kt qu l mt danh
sch cc i tng persistent. Di y l mt v d:
Query query = session.createQuery("from Teacher");
java.util.List<Teacher> teachers = query.list();
i tng teachers c tr v l kt qu thc hin truy vn, trong c
cc i tng persistent Teacher tha mn cc hn ch truy vn ( y
khng c hn ch trong cu truy vn ny).
*Lu : Ging nh SQL, HQL l v cm trng hp (case-insensitive). Bi v
Java l mt ngn ng nhy cm trng hp (case-sensitive), bn nn din t
tt c cc t lin quan n Java (nh classnames, cc tn thuc tnh, )
24

trong trng hp chnh xc. V d, cc hnh thc ng ca biu thc HQL
truy vn cc i tng ca lp Teacher l from Teacher, khng phi l from
teacher, hoc bt k bin th khc ca t Teacher.

8.2 Mnh as
Hnh thc n gin nht ca mt biu thc HQL, trong bao gm ch
mt mnh from v i theo sau l tn lp (classname), l truy vn
tt c cc thc th persistent ca mt lp c th. Tuy nhin, trong nhiu
tnh hung, ng dng cn mt tp con ca cc i tng ph hp vi tp
hp cc tiu chun, thay v ton b cc thc th. Trong tnh hung nh
vy, bn cn phi gn mt b danh cho tp cha cc i tng, v vy bn c
th tham chiu tr li chng trong cc phn khc ca cu truy vn, chng
hn nh truy vn y . Vi mc ch ny, bn s dng mnh as trong
biu thc HQL, nh trong SQL.
V d, load tt c cc i tng Teacher vi tui 30, bn s dng mnh
as trong biu thc HQL (nh sau) gn b danh teacher cho persistent
Teacher
from Teacher as teacher where teacher.age=30
Nh bn c th thy, b danh teacher cho php chng ta tham chiu tr li
cc i tng trong mnh where gii hn kt qu (ta s ni mnh
where sau, trong v d ny th kh r rng khng cn gii thch thm). Cc
t kha as l ty chn. N ch cung cp mt cm gic quen thuc cho cc
developer c kinh nghim vi SQL. V vy, biu thc HQL ny s c
th hin nh sau:
from Teacher teacher where teacher.age=30
Cc biu thc truy vn c th bao gm nhiu lp. Mi lp s c b danh
ring ca n, v d:
from Teacher as teacher, Student as student
25

*Lu : y l mu v d hay t tn b danh cho cu truy vn bng cch s
dng mt ch thng ng u, ph hp vi quy c ca Java t tn cho cc
bin.

8.3 Cc lin kt ca i tng
SQL s dng mnh JOIN lin kt hai hoc nhiu bng v truy vn
chng li vi nhau. Ngi anh em h ca n, HQL cng h tr cc mnh
JOIN vo trng hp truy vn hai hoc nhiu lp persistent trong mt
truy vn duy nht.
Hibernate trnh by 5 join khc nhau c mn t ANSI SQL, nh th
hin trong bng sau:
Join Type Description
Inner Join from Student s inner join s.courses as c

Cross Join from Student s, Teacher t, Course c.

Left Outer Join from Student s left outer join s.courses
as c

Right Outer Join from Student s right outer join s.phone
as p

Full Join from Student s full join s.phone as p

26

hiu cc i tng persistent s dng mnh join, chng ta gi s
rng cc bng STUDENT v COURSE cha cc d liu nh hnh di
y:


Tip theo, gi s rng chng ta s dng inner join ti cc thc th
trng hp Student v Course nh sau:
String joinHQL = "from Student s inner join s.courses as c";
Query joinQuery = session.createQuery(joinHQL);
List results = joinQuery.list();
for(int i=0; i<results.size(); i++){
Object[] objects = (Object[]) results.get(i);
Student student = (Student) objects[0];
Course course = (Course) objects[1];
}
Kt qu l mt danh sch cc mng cc i tng (Object []). Phn t
u tin ca mi mng l mt Student, v phn t th hai l mt thc th
Cource. Hnh di y trnh by cu trc ca cc kt qu:





27


8.4 Mnh select
V d, ly firstName v lastName ca i tng Teacher, lnh truy
vn HQL nh sau:
select teacher.firstName, teacher.lastName from Teacher as teacher
8.5 Cc hm tp hp ca HQL
Cc hm tp hp c h tr trong HQL l avg(), min(), max(), sum(),
v count().
- V d, truy vn HQL sau y tr v tui trung bnh ca
Student:
select avg(student.age) from Student student
- Khi bn thc hin truy vn ny, bn s c c mt danh sch i
tng, m c mt gi tr Integer n. y l trng hp vi tt c
cc hm tp hp.
- V d, on HQL di y ch tr v tng s tui khc nhau ca
cc student:
select count(distinct student.age) from Student student
- V d, on di y ly tui ti thiu v ti a ca Student:
String queryHQL = "select min(std.age), max(std.age) from
Student std";
Query query = session.createQuery(queryHQL);
List bounds = query.list();
Double min = (Double)bounds.get(0);
Double max = (Double)bounds.get(1);

8.6 Mnh where
HQL l linh hot v hiu qu nh SQL, bi v n cung cp mnh
where gii hn kt qu ca cu truy vn. Trong cc biu thc HQL,
28

mnh where cho php chng ta rng buc cc gi tr thuc tnh ca
cc i tng c tr v bi truy vn, v gii hn kt qu ca truy vn.
Ngoi ra, bn s thy trong phn sau, bn c th s dng mnh where
trong biu thc truy vn bulk-update hay bulk-delete hn ch cc i
tng ang cp nht hoc b xa, tng ng. Thng thng, bn tham
chiu n cc i tng c chn bng b danh. Nu b danh khng tn
ti, th bn c th tham chiu thuc tnh bng tn.
V d, cc biu thc truy vn sau y l nh nhau, ly tt c cc thc th
Student c tui ln hn 25:
from Student student where student.age>25
from Student where age>25
Nh bn c th thy trong cc cu lnh HQL ny, mnh where c th
bao gm cc gi tr nguyn thy, chng hn nh cc number v Boolean,
khi iu kin c xc nh c th. Bn cng c th s dng cc gi tr
string so snh trong mnh where, nhng nhng iu ny phi c
t trong du kp n . Ngoi ra, n c th so snh cc thuc tnh ca
cc i tng vi cc thuc tnh khc.
th hin s hn ch trong cc biu thc HQL v JPA-QL, v nh
ngha so snh hn ch gia cc thuc tnh, Hibernate v JPA h tr mt
lot cc ton t, cc hm so snh phong ph v mnh, bao gm nh sau:


Cc ton t /Cc hm Cc k hiu
Ton t ton hc +, -, *, /
Ton t so snh =, >=, <=, <>, !=, like, not like
Ton t logic and, or, not
29

Ton t nhm in, not in, between, is null, is not
null, is empty, is not empty,
member of, not member of
Scalar database-supported
functions
sign(), trunc(), rtrim(), sin()
Cc hm Collection-valued
taken (ch dng cho HQL)
minelement(), maxelement(),
minindex(), maxindex()
Cc hm time and date (ch
dng cho HQL)
current_date(), current_time(),
current_timestamp(), second(),
minute(), hour(), day(), month(),
year()
Cc hm tiu chun JPA substring(), trim(), lower(), upper(),
length(), locate(), abs(), sqrt(),
mod(), sort(), concat(), locate(),
size()

Di y l mt v d v s dng not like v ton t > truy vn tt c cc
Student tui ln hn 18, v c tn u tin khng bt u vi "Jo":
from Student where age>18 and firstName not like Jo%'Ton t like v
not like i km vi biu tng k t i din % v _.
Ton t like v not like cho php chng ta ly kt qu tng ng l ging
hoc khc nhau mt cm t chng ti p dng trc hoc sau mt biu
tng.
Hy tham kho ti liu Hibernate:
http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/#queryhql-
expressions bit thm chi tit v cc hm ny.
30


8.7 Mnh order by v group by
Cc i tng tr v ca mt truy vn HQL c th c sp xp theo bt
k thuc tnh ca cc i tng c chn. lm iu ny, s dng
mnh order by trong cc biu thc HQL, hoc l tng dn (asc) hay
gim dn (desc). V d, truy vn HQL sau y i tng sinh vin sp xp
thuc tnh firstName theo th t tng dn:
from Student s order by s.firstName asc
Ta c th sp xp cho nhiu thuc tnh. Trong trng hp ny, bn cn
thm cc thuc tnh b sung kt thc mnh order by, l du phy.
V d, bn c th lm iu ny:
from Student s order by s.firstName asc, s.age desc
Chn tt c cc i tng Student ny v sp xp firstName theo th t
tng dn, v sau sp xp thuc tnh age theo th t gim dn.
HQL cng cho php chng ta s dng mnh group by nhm cc gi
tr gp tr v bng bt c thuc tnh no m i tng chn:
select student.age, avg(student.age), count(student) from Student student
group by student.age
Nu c s d liu c bn h tr n th bn c th s dng cc hm gp nh
mnh having hay order by.
*Lu : Khng mnh group by cng khng mnh order by c th cha
cc biu thc s hc

You might also like