Introduction to Hibernate Framework | Hibernate Framework in Java
Hibernate zapytania
description
Transcript of Hibernate zapytania
Odwzorowania relacyjno-obiektowe
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
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
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
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();
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%’ '
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();
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 ";
}
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);
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
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;
}
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
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];
}
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
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();
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();
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
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
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
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
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)
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)
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
)
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)
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();
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();
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();
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();
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);
......
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();
}
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());
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);
}
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);
}
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()));
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));
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));
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);
}
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);
}
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();
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
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();
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();
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();
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[]
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);
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();
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;
}}
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)
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 { ....
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")