500 likes | 681 Vues
Hibernate zapytania. Zapytania w Hibernate. Zapytania w języku HQL (Hibernate Query Language) Zapytania poprzez obiekty Criteria Zapytania poprzez obiekty Example Zapytania w natywnym SQL Filtry. 2. EJB QL -selekcja. Wyszukiwanie encji w kontekście
E N D
Hibernate zapytania
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
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
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
Przykład zapytania (I) 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
Przykład zapytania (II) 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
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
Większa liczba warunków (I) 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
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
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
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
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
Funkcje agregujące (I) 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
Funkcje agregujące (II) 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Wyszukiwanie po wartości 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
Wyszukiwanie na podstawie listy criteria.add(Restrictions.in(getProperty(), list)); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
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
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
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
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
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
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
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
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
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
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
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
@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
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
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