Odwzorowania relacyjno-obiektowe Hibernate zapytania 2 Odwzorowania relacyjno-obiektowe Zapytania w Hibernate • Zapytania w języku HQL (Hibernate Query Language) • Zapytania poprzez obiekty Criteria • Zapytania poprzez obiekty Example • Zapytania w natywnym SQL • Filtry Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 2 3 Odwzorowania relacyjno-obiektowe EJB QL -selekcja • Wyszukiwanie encji w kontekście EJB QL ::= <select_clause> <from_clause> [<where_clause>] [<groupby_clause>] [<having_clause>] [<orderby_clause>] • Przykład: select uzytkownik from Uzytkownik uzytkownik where uzytkownik.id = 21 Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 3 Odwzorowania relacyjno-obiektowe EJB QL -selekcja (II) select uzytkownik, pokoj from Uzytkownik uzytkownik, Pokoj pokoj where uzytkownik.klucz = pokoj.klucz select uzytkownik, szef from Uzytkownik uzytkownik, Uzytkownik szef where uzytkownik.szef = szef Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 4 Przykład zapytania (I) Odwzorowania relacyjno-obiektowe Query query = session.creatQuery("select u from Uzytkownik u where u.id = 21"); List uzytkownicy = query.list(); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 5 Przykład zapytania (II) Odwzorowania relacyjno-obiektowe from Uzytkownik uzytkownik where uzytkownik.imie like ‘ma%’ select uzytkownik.imie from Uzytkownik uzytkownik where uzytkownik.imie like ‘ma%’ ' Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 6 Odwzorowania relacyjno-obiektowe Wykorzystanie parametru Query query = session.createQuery("select u from Uzytkownik u where u.imie = :imie"); query.setParameter(”imie", ”Jan"); List uzytkownik = query.list(); Query query = session.createQuery("select u from Uzytkownik u where u.imie = ?1"); query.setParameter(1, ”Jan"); List uzytkownik = query.list(); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 7 Większa liczba warunków (I) Odwzorowania relacyjno-obiektowe Object[] parametry = new Object[liczba_parametrow]; int i=0; String Zapytanie = "from Uzytkownik as u1 where "; if (imie !=null && !imie.equals("")) { parametry[i] = "%" + imie + "%"; ++i; Zapytanie = Zapytanie + "imie like ? and "; } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 8 Odwzorowania relacyjno-obiektowe Większa liczba warunków (II) if (nazwisko !=null && !nazwisko.equals("")) { parametry[i] = "%"+nazwisko+"%"; ++i; Zapytanie = Zapytanie + "nazwisko like ? and "; } if (pokoj !=null && !pokoj.equals("")) { parametry[i] = pokoj; ++i; Zapytanie = Zapytanie + "biuro.id = ? "; } ArrayList<Uzytkownik> u = (ArrayList<Uzytkownik>) getHibernateTemplate().find(Zapytanie,parametry); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 9 Odwzorowania relacyjno-obiektowe Inne zapytania from Uzytkownik u where u.imie in ( ’Marek', ’Bartosz', ’Piotr' ) from Uzytkownik u where u.imie not in ( ’Marek', ’Bartosz', ’Piotr' ) from Uzytkownik u where u.dzieci.size > 2 from Uzytkownik u where u.data > current_date from java.lang.Object o Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 10 Odwzorowania relacyjno-obiektowe Liczebność public Long count() { List list = (List) getHibernateTemplate().find("select count(*) from Uzytkownik"); Long count = (Long) list.get(0); return count; } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 11 Odwzorowania relacyjno-obiektowe Element maksymalny public Integer max() { Integer max = 0; List list = (List) getHibernateTemplate().find("select max(u.id) from Uzytkownik u"); if (list!=null) max = (Integer) list.get(0); return max; } • max, min, avg, sum, count Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 12 Funkcje agregujące (I) Odwzorowania relacyjno-obiektowe Query query = session.createQuery( "SELECT u.imie, count(*) FROM Uzytkownik AS u"); List results = query.list( ); Iterator it = results.iterator( ); while (it.hasNext( )) { Object[] result = (Object[]) it.next( ); String first = (String)result[0]; Integer count = (Integer)result[1]; } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 13 Funkcje agregujące (II) Odwzorowania relacyjno-obiektowe select new list(u.imie, u.nazwisko) from Uzytkownik u select new Podpis(u.imie, u.nazwisko) from Uzytkownik u Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 14 Odwzorowania relacyjno-obiektowe 15 Aktualizowanie Query q = session.createQuery("update Uzytkownik u set u.zarobki = u.zarobki * 1.10"); int updateCount = q.executeUpdate(); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego Odwzorowania relacyjno-obiektowe Usuwanie Query q = session.createQuery("delete from Uzytkownik u where u.fulfilledDate != null"); int deleteCount = q.executeUpdate(); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 16 Odwzorowania relacyjno-obiektowe Asocjacje • • • • inner join left outer join right outer join full join from Uzytkownik as uzytkownik inner join uzytkownik.adres as adres select u.imie a.ulica from Uzytkownik as u inner join u.adres as a Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 17 Odwzorowania relacyjno-obiektowe Asocjacje from Wypozyczenie w left join w.uzytkownik u where u.plec = 0 left join Uzytkownik u on (w.uzytkownik_id = u.id) from Uzytkownik as uzytkownik left outer join uzytkownik.dzieci as dziecko with dziecko.wiek < 10 Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 18 Odwzorowania relacyjno-obiektowe Sortowanie from Uzytkownik u order by u.imie asc, u.wzrost desc, u.dataUrodzenia Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 19 Odwzorowania relacyjno-obiektowe Grupowanie select u.plec, sum(u.placa), count(u) from Uzytkownik u group by u.plec Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 20 Odwzorowania relacyjno-obiektowe Sortowanie po rozmiarze kolekcji select uzytkownik.id, uzytkownik.imie from Uzytkownik as uzytkownik left join uzytkownik.dzieci as dziecko group by uzytkownik.id, uzytkownik.imie order by count(dziecko) Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 21 Odwzorowania relacyjno-obiektowe Podzapytania (I) Select uzytkownik from Uzytkownik as uzytkownik where uzytkownik.placa > (select avg(u.placa) from Uzytkownik u) Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 22 Odwzorowania relacyjno-obiektowe Podzapytania (II) from Uzytkownik u where not exists ( from Uzytkownik as u2 where u2.szef = u ) Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 23 Odwzorowania relacyjno-obiektowe Podzapytania (III) from Uzytkownik as uzytkownik where uzytkownik.pesel not in //any, some ( select t.nazwa from TypoweImiona as t ) from Uzytkownik as uzytkownik where uzytkownik.placa > all (select u.placa from Uzytkownik u where u.wiek > 50) Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 24 Odwzorowania relacyjno-obiektowe Stronicowanie session.createQuery(”from Uzytkownik u where u.opis like :d") .setParameter("d", "tv") .setMaxResults(10) .setFirstResult(10) .list(); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 25 Odwzorowania relacyjno-obiektowe Unikalne rezultaty Query query = session.createQuery( "SELECT u.imie FROM Uzytkownik AS u") .setMaxResults(100) .uniqueResult(); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 26 Odwzorowania relacyjno-obiektowe Criteria Criteria criteria = session.createCriteria(Uzytkownik.class); criteria.setMaxResults(50); List uzytkownik = criteria.list(); List uzytkownicy = session.createCriteria(Uzytkownik.class) .add(Restrictions.like(”imie", ”Ma%") ) .list(); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 27 Odwzorowania relacyjno-obiektowe Restrictions List uzytkownicy = session.createCriteria(Uzytkownik.class) .add( Restrictions.like(”imie", ”Ma%") ) .add( Restrictions.or( Restrictions.eq( ”wiek", new Integer(30) ), Restrictions.isNull(”wiek"))).list(); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 28 Odwzorowania relacyjno-obiektowe Wyszukiwanie według kryteriów (I) public ArrayList<Uzytkownik> findByCriteria(UzytkownikCriteria uzytkownikPreselection) { if (uzytkownikPreselection == null) return null; Session session; session = sessionFactory().getCurrentSession(); Criteria uzytkownikCriteria = session.createCriteria(Uzytkownik.class); ...... Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 29 Odwzorowania relacyjno-obiektowe Wyszukiwanie według kryteriów (II) addLikeRestrictionTextLike(uzytkownikCriteria, "imie", uzytkownikPreselection.getImie()); addLikeRestrictionTextLike(uzytkownikCriteria, "nazwisko", uzytkownikPreselection.getNazwisko()); uzytkownikCriteria.setResultTransformer( Criteria.DISTINCT_ROOT_ENTITY); return (ArrayList<Uzytkownik>) uzytkownikCriteria.list(); } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 30 Odwzorowania relacyjno-obiektowe 31 Wyszukiwanie według kryteriów (III) Criteria pokojCriteria = uzytkownikCriteria.createCriteria(”pokoj",Criteria.LEFT_JOIN); addLikeRestrictionText(pokojCriteria, ”nazwa", uzytkownikPreselection.getPokojNazwa()); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego Odwzorowania relacyjno-obiektowe Wyszukiwanie po zawartości pola tekstowego private void addLikeRestrictionText(Criteria criteria, String propertyName, String keywords) { if (!StringUtils.hasText(keywords)) return; Junction junc = Restrictions.disjunction(); junc.add(Restrictions.ilike(propertyName,keywords)); criteria.add(junc); } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 32 Odwzorowania relacyjno-obiektowe Wyszukiwanie po zawartości pola tekstowego • private void addLikeRestrictionTextLike(Criteria criteria, String propertyName, String keywords) { if (!StringUtils.hasText(keywords)) return; String[] keywordList = keywords.split("\\s"); Junction junc = Restrictions.disjunction(); for (String word : keywordList) junc.add(Restrictions.ilike(propertyName, '%' + word + '%')); criteria.add(junc); } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 33 Odwzorowania relacyjno-obiektowe Wyszukiwanie w przedziale wartości private void addLikeRestrictionInter(Criteria criteria, String propertyName, int Wartoscod, int Wartoscdo) { Junction junc = Restrictions.disjunction(); junc.add(Restrictions.between(propertyName, Wartoscod, Wartoscdo)); criteria.add(junc); } criteria.add(Restrictions.le(getProperty(), dateEnd.getTime())); criteria.add(Restrictions.ge(getProperty(), dateStart.getTime())); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 34 Wyszukiwanie po wartości Odwzorowania relacyjno-obiektowe 35 private void addLikeRestrictionId(Criteria criteria, Object value) { Junction junc = Restrictions.disjunction(); junc.add(Restrictions.idEq(value)); criteria.add(junc); } junc.add(Restrictions.Eq(propertyName,value)); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego Odwzorowania relacyjno-obiektowe Wyszukiwanie na podstawie listy criteria.add(Restrictions.in(getProperty(), list)); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 36 Odwzorowania relacyjno-obiektowe 37 Wyszukiwanie po zajętości pola (I) private void addLikeRestrictionisNotNull(Criteria criteria, String propertyName) { Junction junc = Restrictions.disjunction(); junc.add(Restrictions.isNotNull(propertyName)); criteria.add(junc); } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego Odwzorowania relacyjno-obiektowe Wyszukiwanie po zajętości pola (II) private void addLikeRestrictionisNull(Criteria criteria, String propertyName) { Junction junc = Restrictions.disjunction(); junc.add(Restrictions.isNull(propertyName)); criteria.add(junc); } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 38 Odwzorowania relacyjno-obiektowe Sortowanie List uzytkownicy = session.createCriteria(Uzytkownik.class) .add( Restrictions.like(”imie", ”M%") .addOrder( Order.asc(”imie") ) .addOrder( Order.desc(”wiek") ) .setMaxResults(30) .list(); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 39 Odwzorowania relacyjno-obiektowe 40 Projection List results = session.createCriteria(Uzytkownik.class) .setProjection( Projections.projectionList() .add( Projections.rowCount() ) .add( Projections.avg(”placa") ) .add( Projections.max(”placa") ) .add( Projections.groupProperty(”plec") )) .list(); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego Odwzorowania relacyjno-obiektowe DetachedCriteria (I) DetachedCriteria query = DetachedCriteria.forClass(Uzytkownik.class) .add( Property.forName(”wiek").eq(30) ); Session session = ....; Transaction txn = session.beginTransaction(); List results = query.getExecutableCriteria(session).list(); txn.commit(); session.close(); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 41 Odwzorowania relacyjno-obiektowe DetachedCriteria (II) DetachedCriteria avgPlaca = DetachedCriteria.forClass(Uzytkownik.class) .setProjection( Property.forName(”placa").avg() ); session.createCriteria(Uzytkownik.class) .add( Property.forName(”placa").gt(avgPlaca) ) .list(); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 42 Odwzorowania relacyjno-obiektowe 43 Wyszukiwanie przez przykład Uzytkownik uzytkownik = new Uzytkownik(); uzytkownik.setImie(’Marek'); uzytkownik.setWiek(30); List results = session.createCriteria(Uzytkownik.class) .add( Example.create(uzytkownik) ) .list(); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego Odwzorowania relacyjno-obiektowe Zapytania w SQL (I) session.createSQLQuery("SELECT * FROM UZYTKOWNIK").list(); session.createSQLQuery("SELECT ID, IMIE, DATAURODZENIA FROM UZYTKOWNIK").list(); • zwracana wartość: Lista Object[] Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 44 Odwzorowania relacyjno-obiektowe Zapytania w SQL (II) session.createSQLQuery("SELECT * FROM UZYTKOWNIK") .addScalar("ID", Hibernate.LONG) .addScalar(”IMIE", Hibernate.STRING) .addScalar(”DATAURODZENIA", Hibernate.DATE) sess.createSQLQuery("SELECT * FROM UZYTKOWNIK").addEntity(Uzytkownik.class); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 45 Odwzorowania relacyjno-obiektowe Zapytania w SQL (III) query = session.createSQLQuery("SELECT * FROM UZYTKOWNIK WHERE IMIE like:imie") .addEntity(Uzytkownik.class); List uzytkownicy = query.setString(”imie", ”Ma%").list(); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 46 Odwzorowania relacyjno-obiektowe Iterate Query Iterator iterator = session.createQuery("from Ksiazka k order by k.numer").iterate(); while ( iterator.hasNext() ) { Ksiazka k = (Ksiazka) iterator.next(); if ( ksiazka.wyszukiwanie(„slowo”) ) { iterator.remove(); break; }} Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 47 Odwzorowania relacyjno-obiektowe @Formula @Formula ("imie||' '||nazwisko") String Label; @Formula ("(select w.datawypozyczenia from Wypozyczenie w where w.ksiazka_id = id and w.datazwrotu is null)") private Date dataOstatniegoWypozyczenia; INTERVAL(0) Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 48 Odwzorowania relacyjno-obiektowe 49 Filtr (I) @FilterDefs( { @FilterDef( name = "aktywny", parameters = @ParamDef( type = "boolean", name = "active")) }) @Entity @Filters( { @Filter( name = "aktywny", condition = "aktywny = :active") }) public class uzytkownik { .... Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego Odwzorowania relacyjno-obiektowe Filtr (II) session.enableFilter(”aktywny") .setParameter(”active", true); session.createQuery .... session.getEnableFilter(”aktywny") session.disableFilter(”aktywny") Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 50