You are on page 1of 30

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
1

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

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
3

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).

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
5

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 sessionfactory.

nh ngha cc properties ca session-factory, ta s dng


th <property name=>class</property>.

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

show_sql

Dialect

hibernate.hbm2ddl.auto

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
7

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.

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 Builtin 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 vendorspecific 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
9

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>
10

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>

11

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"
12

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.

13

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
14

//

//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


15

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

16

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

17

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

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,

19

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

20

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()
21

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.
22

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, )
23

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

24

*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

25

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:

26

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,
27

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

28

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

sign(), trunc(), rtrim(), sin()

functions
Cc hm Collection-valued

minelement(), maxelement(),

taken (ch dng cho HQL)

minindex(), maxindex()

Cc hm time and date (ch

current_date(), current_time(),

dng cho HQL)

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/#queryhqlexpressions bit thm chi tit v cc hm ny.
29

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

30

You might also like