Hibernate Criteria APIA 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ásaAz Criteria criteria = session.createCriteria(Person.class).setMaxResults(30);
List people = criteria.list();
A
Eredményhalmaz szűkítéseRestrictionsAz A
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();
PropertyAz 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éseOrderAz Az Order interfész néhány metódusa:
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 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ésbeExampleAz 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éseProjectionA 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:
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ésekDetachedCriteriaA 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();
Források |