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
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
3
Odwzorowania relacyjno-obiektowe
EJB QL -selekcja (II)
select uzytkownik
from Uzytkownik uzytkownik, Pokoj pokoj
where uzytkownik.klucz = pokoj.klucz
select uzytkownik, szef
from Uzytkownik uzytkownik, Uzytkownik szef
where uzytkownik.szef = szef
4
Przykład zapytania (I)
Odwzorowania relacyjno-obiektowe
Query query = session.creatQuery("select u from
Uzytkownik u where u.id = 21");
List uzytkownicy = query.getResultList();
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%’ '
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.getResultList();
Query query = session.createQuery("select u from Uzytkownik
u where u.imie = ?1");
query.setParameter(1, ”Jan");
List uzytkownik = query.getResultList();
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 ";
}
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);
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
10
Liczebność
Odwzorowania relacyjno-obiektowe
public Long count()
{
List list = (List) getHibernateTemplate().find("select count(*) from
Uzytkownik");
Long count = (Long) list.get(0);
return count;
}
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
12
Funkcje agregujące (I)
Odwzorowania relacyjno-obiektowe
Query query = session.createQuery(
"SELECT u.imie, count(*) FROM Uzytkownik AS u");
List results = query.getResultList( );
Iterator it = results.iterator( );
while (it.hasNext( )) {
Object[] result = (Object[]) it.next( );
String first = (String)result[0];
Integer count = (Integer)result[1];
}
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
14
Odwzorowania relacyjno-obiektowe
15
Aktualizowanie
Query q = session.createQuery("update Uzytkownik u
set u.zarobki = u.zarobki * 1.10");
int updateCount = q.executeUpdate();
Odwzorowania relacyjno-obiektowe
Usuwanie
Query q = session.createQuery("delete from
Uzytkownik u where u.fulfilledDate != null");
int deleteCount = q.executeUpdate();
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
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
18
Odwzorowania relacyjno-obiektowe
Sortowanie
from Uzytkownik u
order by u.imie asc, u.wzrost desc, u.dataUrodzenia
19
Odwzorowania relacyjno-obiektowe
Grupowanie
select u.plec, sum(u.placa), count(u)
from Uzytkownik u
group by u.plec
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)
21
Odwzorowania relacyjno-obiektowe
Podzapytania (I)
Select uzytkownik
from Uzytkownik as uzytkownik
where uzytkownik.placa >
(select avg(u.placa) from Uzytkownik u)
22
Odwzorowania relacyjno-obiektowe
Podzapytania (II)
from Uzytkownik u
where not exists
(
from Uzytkownik as u2 where u2.szef = u
)
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)
24
Odwzorowania relacyjno-obiektowe
Stronicowanie
session.createQuery(”from Uzytkownik u where
u.opis like :d")
.setParameter("d", "tv")
.setMaxResults(10)
.setFirstResult(10)
.listResults();
25
Odwzorowania relacyjno-obiektowe
Unikalne rezultaty
Query query = session.createQuery(
"SELECT u.imie FROM Uzytkownik AS u")
.setMaxResults(100)
.uniqueResult();
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();
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();
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);
......
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();
}
30
Odwzorowania relacyjno-obiektowe
Wyszukiwanie według kryteriów (III)
Criteria pokojCriteria =
uzytkownikCriteria.createCriteria(”pokoj",Criteria.LEFT_JOIN);
addLikeRestrictionText(pokojCriteria, ”nazwa",
uzytkownikPreselection.getPokojNazwa());
31
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);
}
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);
}
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()));
34
Wyszukiwanie po wartości
Odwzorowania relacyjno-obiektowe
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));
35
Odwzorowania relacyjno-obiektowe
Wyszukiwanie na podstawie listy
criteria.add(Restrictions.in(getProperty(), list));
36
Odwzorowania relacyjno-obiektowe
37
Wyszukiwanie po zajętości pola
private void addLikeRestrictionisNotNull(Criteria criteria, String
propertyName)
{
Junction junc = Restrictions.disjunction();
junc.add(Restrictions.isNotNull(propertyName));
criteria.add(junc);
}
Odwzorowania relacyjno-obiektowe
Wyszukiwanie po zajętości pola
private void addLikeRestrictionisNull(Criteria criteria, String
propertyName)
{
Junction junc = Restrictions.disjunction();
junc.add(Restrictions.isNull(propertyName));
criteria.add(junc);
}
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();
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();
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();
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();
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();
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[]
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);
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();
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;
}}
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)
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 { ....
Odwzorowania relacyjno-obiektowe
Filtr (II)
session.enableFilter(”aktywny")
.setParameter(”active", true);
session.createQuery ....
session.getEnableFilter(”aktywny")
session.disableFilter(”aktywny")
50
Download