Hibernate Criteria API
A Hibernate – relációs/objektumrelációs perzisztenciakezelést megvalósító eszközrendszer – rendelkezik egy Criteria nevű keretrendszerrel, amely arra szolgál, hogy segítségével objektumorientált módon lehet lekérdezéseket megfogalmazni olyan módon, hogy az entitásokhoz bizonyos feltételeket, kritériumokat definiálunk.
Criteria példányok létrehozása
[szerkesztés]Az org.hibernate.Criteria
interfész alkotja a lekérdezést, melynek példányai a Session
objektumokból jönnek létre.
Criteria criteria = session.createCriteria(Person.class).setMaxResults(30);
List people = criteria.list();
A Criteria
interfész néhány metódusa:
- add(Criterion criterion)
- addOrder(Order order)
- list()
- getAlias()
- createAlias(String associationPath, String alias)
- setFirstResult(int firstResult)
- setMaxResults(int maxResults)
- setProjection(Projection projection)
Eredményhalmaz szűkítése
[szerkesztés]Restrictions
[szerkesztés]Az org.hibernate.criterion.Restrictions
(restiction = korlátozás) interfész metódusai a lekérdezések eredményhalmazát különböző megszorításokkal szűkítik. A Restictions
osztály metódusai hasonló szűréseket valósítanak meg, mint amik az SQL lekérdező nyelvekből ismertek.
A Restrictions
interfész néhány metódusa:
- like(String propertyName, Object value)
- between(String propertyName, Object lo, Object hi)
- or(Criterion lhs, Criterion rhs)
- and(Criterion lhs, Criterion rhs)
- eq(String propertyName, Object value) (equal)
- ge(String propertyName, Object value) (greater than or equal)
- gt(String propertyName, Object value) (greater then)
- isEmpty(String propertyName)
- isNull(String propertyName)
- disjunction() (A vagy B vagy C...)
- conjunction() (A és B és C...)
Példák:
List people = session.createCriteria(Person.class)
.add( Restrictions.like("birthplace", "London") )
.add( Restrictions.between("age", minAge, maxAge) )
.list();
A kritériumok logikai csoportosítása diszjunkcióval:
List people = session.createCriteria(Person.class)
.add( Restrictions.in( "birthplace", new String[] { "London", "Bristol", "Oxford" } ) )
.add( Restrictions.disjunction()
.add( Restrictions.isNull("age") )
.add( Restrictions.eq("age", new Integer(0) ) )
.add( Restrictions.eq("age", new Integer(1) ) )
.add( Restrictions.eq("age", new Integer(2) ) )
) )
.list();
Lehet beépíteni közvetlenül SQL szűréseket is a lekérdezésekbe.
List people = session.createCriteria(Person.class)
.add(Restrictions.sqlRestriction("lower({alias}.birthPlace) like lower(?)", "London", Hibernate.STRING) )
.list();
Property
[szerkesztés]Az org.hibernate.criterion.Property
(property = tulajdonság) osztály forName() metódusával saját nevet adhatunk meg az entitás tulajdonságainak.
Példa:
Property age = Property.forName("age");
List people = session.createCriteria(Person.class)
.add( Restrictions.disjunction()
.add( age.isNull() )
.add( age.eq( new Integer(0) ) )
.add( age.eq( new Integer(1) ) )
.add( age.eq( new Integer(2) ) )
) )
.list();
Eredmények rendezése
[szerkesztés]Order
[szerkesztés]Az org.hibernate.criterion.Order
interfész felhasználásával lehet rendezni az eredményhalmazt.
Az Order interfész néhány metódusa:
- asc(String propertyName) ( ascending order – növekvő rendezés)
- desc(String propertyName) ( descending order – csökkenő rendezés)
List people= session.createCriteria(Person.class)
.add( Restrictions.like("name", M%")
.addOrder( Order.asc("name") )
.addOrder( Order.desc("age") )
.setMaxResults(50)
.list();
Asszociáció
[szerkesztés]Egymáshoz kapcsolódó entitásokra vonatkozó lekérdezések.
List people = session.createCriteria(Person.class)
.add( Restrictions.like("name", "M%") )
.createCriteria("kids")
.add( Restrictions.like("name", "M%") )
.list();
A második createCriteria() egy új Criteria
példánnyal tér vissza, mely a ”kids” (másik entitás) kollekció példányaira hivatkozik.
Van egy másik formája is az asszociáció létrehozásának. Ha a createCriteria() helyett a createAlias(”masik_entitas”,”aliasnev”) metódust adjuk meg, amelyben az ”aliasnev” -vel hivatkozunk a ”masik_entitas” entitásunkra.
List people = session.createCriteria(Person .class)
.createAlias("kids", "k")
.createAlias("adults", "a")
.add( Restrictions.eqProperty("k.name", "a.name") )
.list();
A setFetchMode() segítségével állíthatjuk be, hogy melyik osztály milyen módon kerüljön betöltésre. Létezik FetchMode.EAGER és FetchMode.LAZY, azaz gyors és lassú kapcsolási mód.
List people= session.createCriteria(Person.class)
.add( Restrictions.like("name", "M%") )
.setFetchMode("adults", FetchMode.EAGER)
.setFetchMode("kids", FetchMode.EAGER)
.list();
Objektum példány beágyazása a lekérdezésbe
[szerkesztés]Example
[szerkesztés]Az org.hibernate.criterion.Example
interfész lehetővé teszi, hogy egy objektum példányból állítsuk össze lekérdezést.
Példa:
Person p = new Person();
p.setAge(5);
p.setBirthPlace(„London”);
List results = session.createCriteria(Person.class)Projection
.add( Example.create(p) )
.list();
Vagy adhatunk hozzá további kritériumokat a következőképpen:
Example example = Example.create(p)
.excludeZeroes()
.excludeProperty("name")
.ignoreCase()
.enableLike();
List results = session.createCriteria(Person.class)
.add( example )
.list();
Eredményhalmaz megjelenítése
[szerkesztés]Projection
[szerkesztés]A Criteria interfész setProjection() metódusával tudjuk beállítani a megjelenítési módokat. Paraméterül adva neki egy org.hibernate.criterion.Projections példányt.
A Projections néhány megtódusa:
- alias(Projection projection, String alias)
- avg(String propertyName)
- count(String propertyName)
- distinct(Projection proj)
- groupProperty(String propertyName)
- max(String propertyName)
- min(String propertyName)
- rowCount()
- sum(String propertyName)
Példa:
List rows = session.createCriteria(Person.class)
.setProjection( Projections.rowCount() )
.add( Restrictions.eq("name", „M%”) )
.list();
List results = session.createCriteria(Person.class)
.setProjection( Projections.projectionList()
.add( Projections.rowCount() )
.add( Projections.avg("age") )
.add( Projections.max("height") )
.add( Projections.groupProperty("birthplace") )
)
.list();
Itt szintén megadhatunk saját nevet annak a tulajdonságnak, ami alapján csoportosítunk. Két -féle módon tehetjük meg.
List results = session.createCriteria(Person.class)
.setProjection( Projections.alias( Projections.groupProperty("birthplace"), "bp" ) )
.addOrder( Order.asc("bp") )
.list();
List results = session.createCriteria(Person.class)
.setProjection( Projections.groupProperty("birthplace").as("bp") )
.addOrder( Order.asc("bp") )
.list();
Különálló lekérdezések
[szerkesztés]DetachedCriteria
[szerkesztés]A org.hibernate.criterion.DetachedCriteria
interfésszel lehetőségünk van arra, hogy a session s scope-ján kívül készítstünk lekérdezéseket. A DetachedCriteria egy allekérdezést fejez ki, létrehozása után (DetachedCriteria.forClass(...)) közel azok a metódusok használhatóak, mint a createCriteria() esetében.
DetachedCriteria query = DetachedCriteria.forClass(Person.class)
.add( Property.forName("birthPlace").eq(„London”) );
Session session = ....;
Transaction txn = session.beginTransaction();
List results = query.getExecutableCriteria(session).setMaxResults(100).list();
txn.commit();
session.close();