11
Criteria Når og hvorfor bruke Criteria i Hibernate

Criteria

  • Upload
    manning

  • View
    53

  • Download
    4

Embed Size (px)

DESCRIPTION

Criteria. Når og hvorfor bruke Criteria i Hibernate. Hva er Criteria. Et alternativ til HQL Representerer en spørring mot en enkelt, persistent klasse Innsnevring av søket ved å legge til restriksjoner (Restrictions). Hvorfor Criteria?. Gi renere Java-kode ved et avansert søk - PowerPoint PPT Presentation

Citation preview

Page 1: Criteria

Criteria

Når og hvorfor bruke Criteria i Hibernate

Page 2: Criteria

Hva er Criteria

• Et alternativ til HQL

• Representerer en spørring mot en enkelt, persistent klasse

• Innsnevring av søket ved å legge til restriksjoner (Restrictions)

Page 3: Criteria

Hvorfor Criteria?

• Gi renere Java-kode ved et avansert søk

• Bedre støtte for unike resultater ved mange foreninger av andre tabeller

Page 4: Criteria

SQL vs HQL vs. Criteria

Alle rader

SQLSELECT * FROM user;

HQLQuery query = getSession().createQuery(”from User”);

CriteriaCriteria criteria = getSession.createCriteria(User.class);

Page 5: Criteria

SQL vs HQL vs. Criteria (frts.)

Alle rader med e-post lik …

SQLSELECT * FROM user WHERE email = ?;

HQLQuery query = getSession().createQuery(”from User u where u.email

= :email”);query .setParameter(”email”, email);

CriteriaCriteria criteria = getSession.createCriteria(User.class);If (email != null && email.length() > 0)

critera.add(Restriction.eq(”email”, email);

Page 6: Criteria

Så hva er ”greia”?

• What’s the big deal, lizm..?

• For enklere spørringer gir det tyngre syntaks. Bruk HQL!

• For kompliserte spørringer er det motsatt. Eksempel på HQL følger:

Page 7: Criteria

Eksempel på tyngre HQLString hql = ”from Project p where lower(p.title) like lower

(:searchString) or lower (p.user.unit) like lower (:searchString) or lower (p.user.fullname) like lower (:searchString)”;

if (fromDate != null)hql += ” and p.dateRegistered > :fromDate”;

If (toDate != null)hql += ” and p.dateRegistered < :toDate”;

Query query = getSession.createQuery(hql);query.setParameter(”searchString”, ”%” + searchString + ”%”;if (fromDate != null)

query.setParameter(”fromDate”, fromDate);if (toDate != null)

query.setParameter(”toDate”, toDate);

Page 8: Criteria

Oversatt til CriteriaCriteria criteria = getSession().createCriteria(Project.class);criteria.addAlias(”user”, u);criteria.add(Restriction.disjunction() .add(Restriction.ilike(”title”, searchString, MatchMode.ANYWHERE)) .add(Restriction.ilike(”u.unit”, searchString,

MatchMode.ANYWHERE)) .add(Restriction.ilike(”u.fullname”, searchString,

MatchMode.ANYWHERE)));if (fromDate != null)

criteria.add(Restriction.gt(”dateRegistered”, fromDate);If (toDate != null)

criteria.add(Restriction.lt(”dateRegistered”, toDate);

Page 9: Criteria

Når brukes Criteria?

• Når en ellers må bygge opp HQL-strengen med mange parametere, ved ”hql += …”

• Ved komplekse AND- og OR-søk blandet

• Når en ønsket et unikt resultat fra forening med mange andre tabeller. HQL støtter ikke dette. Criteria:

criteria.setResultTransformer(

Criteria.DISTINCT_ROOT_ENTITY);

Page 10: Criteria

Ikke overbevist?

• Q: Criteria er mye tyngre enn HQL

• A: Ja!

• Q: Og derfor?

• A: Vel, hvis du synes det er bedre å lese følgende kode, så og ahead! Og husk at du i tillegg må implementere fjerning av dupliserte rader fra resultatet ved forening av mange tabeller!

Page 11: Criteria

For de HQL-frelstetring hql = "select project from Project project join project.user user where \n"

                + "( lower(project.title) like lower(:searchString) \n"                 + "  or lower(user.unit) like lower(:searchString) \n"                 + "  or lower(user.fullname) like lower(:searchString) ) \n";         if (doBothDateSearch) {             hql = hql + " and ( project.dateRegistered > :fromDate \n";             hql = hql + "       and project.dateRegistered < :toDate ) \n";         }         if (doFromDateSearch) {             hql = hql + " and project.dateRegistered > :fromDate \n";         }         if (doToDateSearch) {             hql = hql + " and project.dateRegistered < :toDate \n";         }

        if (infoDelivered == true) {             hql = hql + " and lower(project.informationDelivered) like 'ja' \n";         }         if (students) {             hql = hql + " and 1 member of project.categories \n";         }         if (employees) {             hql = hql + " and 2 member of project.categories \n";         }         if (others) {             hql = hql + " and 3 member of project.categories \n";         }

        Query query = getSession().createQuery(hql);         query.setParameter("searchString", "%" + searchString + "%");         if (doBothDateSearch) {             query.setParameter("fromDate", fromDate);             query.setParameter("toDate", toDate);         }         if (doFromDateSearch) {             query.setParameter("fromDate", fromDate);         }         if (doToDateSearch) {             query.setParameter("toDate", toDate);         }