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
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
• Bedre støtte for unike resultater ved mange foreninger av andre tabeller
SQL vs HQL vs. Criteria
Alle rader
SQLSELECT * FROM user;
HQLQuery query = getSession().createQuery(”from User”);
CriteriaCriteria criteria = getSession.createCriteria(User.class);
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);
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:
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);
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);
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);
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!
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); }