Hibernate zapytania

50
Odwzorowania relacyjno- obiektowe Hibernate zapytania

description

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 - PowerPoint PPT Presentation

Transcript of Hibernate zapytania

Page 1: Hibernate zapytania

Odwzorowania relacyjno-obiektowe

Hibernate

zapytania

Page 2: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

2Odwzorowania relacyjno-obiektowe

2

Zapytania w Hibernate

• Zapytania w języku HQL (Hibernate Query Language)

• Zapytania poprzez obiekty Criteria• Zapytania poprzez obiekty Example• Zapytania w natywnym SQL • Filtry

Page 3: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

3Odwzorowania relacyjno-obiektowe

3

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

Page 4: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

4Odwzorowania 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

Page 5: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

5Odwzorowania relacyjno-obiektowe Przykład zapytania (I)

Query query = session.creatQuery("select u from Uzytkownik u where u.id = 21");

List uzytkownicy = query.list();

Page 6: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

6Odwzorowania relacyjno-obiektowe Przykład zapytania (II)

from Uzytkownik uzytkownik where uzytkownik.imie like ‘ma%’

select uzytkownik.imie from Uzytkownik uzytkownik where uzytkownik.imie like ‘ma%’ '

Page 7: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

7Odwzorowania 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();

Page 8: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

8Odwzorowania relacyjno-obiektowe 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 ";

}

Page 9: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

9Odwzorowania 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);

Page 10: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

10Odwzorowania 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

Page 11: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

11Odwzorowania relacyjno-obiektowe Liczebność

public Long count()

{

List list = (List) getHibernateTemplate().find("select count(*) from Uzytkownik");

Long count = (Long) list.get(0);

return count;

}

Page 12: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

12Odwzorowania 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

Page 13: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

13Odwzorowania relacyjno-obiektowe 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];

}

Page 14: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

14Odwzorowania relacyjno-obiektowe Funkcje agregujące (II)

select new list(u.imie, u.nazwisko)

from Uzytkownik u

select new Podpis(u.imie, u.nazwisko)

from Uzytkownik u

Page 15: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

15Odwzorowania relacyjno-obiektowe Aktualizowanie

Query q = session.createQuery("update Uzytkownik u

set u.zarobki = u.zarobki * 1.10");

int updateCount = q.executeUpdate();

Page 16: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

16Odwzorowania relacyjno-obiektowe Usuwanie

Query q = session.createQuery("delete from Uzytkownik u where u.fulfilledDate != null");

int deleteCount = q.executeUpdate();

Page 17: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

17Odwzorowania 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

Page 18: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

18Odwzorowania 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

Page 19: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

19Odwzorowania relacyjno-obiektowe Sortowanie

from Uzytkownik u

order by u.imie asc, u.wzrost desc, u.dataUrodzenia

Page 20: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

20Odwzorowania relacyjno-obiektowe Grupowanie

select u.plec, sum(u.placa), count(u)

from Uzytkownik u

group by u.plec

Page 21: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

21Odwzorowania 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)

Page 22: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

22Odwzorowania relacyjno-obiektowe Podzapytania (I)

Select uzytkownik

from Uzytkownik as uzytkownik

where uzytkownik.placa >

(select avg(u.placa) from Uzytkownik u)

Page 23: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

23Odwzorowania relacyjno-obiektowe Podzapytania (II)

from Uzytkownik u

where not exists

(

from Uzytkownik as u2 where u2.szef = u

)

Page 24: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

24Odwzorowania 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)

Page 25: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

25Odwzorowania relacyjno-obiektowe Stronicowanie

session.createQuery(”from Uzytkownik u where u.opis like :d")

.setParameter("d", "tv")

.setMaxResults(10)

.setFirstResult(10)

.list();

Page 26: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

26Odwzorowania relacyjno-obiektowe Unikalne rezultaty

Query query = session.createQuery(

"SELECT u.imie FROM Uzytkownik AS u")

.setMaxResults(100)

.uniqueResult();

Page 27: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

27Odwzorowania 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();

Page 28: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

28Odwzorowania 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();

Page 29: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

29Odwzorowania 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);

......

Page 30: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

30Odwzorowania 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();

}

Page 31: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

31Odwzorowania relacyjno-obiektowe Wyszukiwanie według kryteriów (III)

Criteria pokojCriteria =

uzytkownikCriteria.createCriteria(”pokoj",Criteria.LEFT_JOIN);

addLikeRestrictionText(pokojCriteria, ”nazwa", uzytkownikPreselection.getPokojNazwa());

Page 32: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

32Odwzorowania 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);

}

Page 33: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

33Odwzorowania 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);

}

Page 34: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

34Odwzorowania 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()));

Page 35: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

35Odwzorowania relacyjno-obiektowe 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));

Page 36: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

36Odwzorowania relacyjno-obiektowe Wyszukiwanie na podstawie listy

criteria.add(Restrictions.in(getProperty(), list));

Page 37: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

37Odwzorowania relacyjno-obiektowe 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);

}

Page 38: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

38Odwzorowania 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);

}

Page 39: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

39Odwzorowania 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();

Page 40: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

40Odwzorowania relacyjno-obiektowe

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();

Projection

Page 41: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

41Odwzorowania 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();

Page 42: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

42Odwzorowania 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();

Page 43: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

43Odwzorowania relacyjno-obiektowe 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();

Page 44: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

44Odwzorowania 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[]

Page 45: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

45Odwzorowania 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);

Page 46: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

46Odwzorowania 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();

Page 47: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

47Odwzorowania 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;

}}

Page 48: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

48Odwzorowania 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)

Page 49: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

49Odwzorowania relacyjno-obiektowe Filtr (I)

@FilterDefs( {

@FilterDef( name = "aktywny", parameters = @ParamDef( type = "boolean", name = "active")) })

@Entity

@Filters( {

@Filter( name = "aktywny",

condition = "aktywny = :active") })

public class uzytkownik { ....

Page 50: Hibernate zapytania

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

50Odwzorowania relacyjno-obiektowe Filtr (II)

session.enableFilter(”aktywny")

.setParameter(”active", true);

session.createQuery ....

session.getEnableFilter(”aktywny")

session.disableFilter(”aktywny")