110 likes | 405 Views
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
E N D
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 SQL SELECT * FROM user; HQL Query query = getSession().createQuery(”from User”); Criteria Criteria criteria = getSession.createCriteria(User.class);
SQL vs HQL vs. Criteria (frts.) Alle rader med e-post lik … SQL SELECT * FROM user WHERE email = ?; HQL Query query = getSession().createQuery(”from User u where u.email = :email”); query .setParameter(”email”, email); Criteria Criteria 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 HQL String 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 Criteria Criteria 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-frelste tring 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); }