Hibernate Criteria API
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 objektum-orientá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
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
Restrictions
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
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
Order
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ó
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
Example
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
Projection
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
DetachedCriteria
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();
Hivatkozások
http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html
http://oreilly.com/java/excerpts/harnessing-hibernate/the-criteria-API.html