Hibernate = zapytania

advertisement
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
Download