HQL Query and Criteria - Examples
HQL doc. - dokumentacija
two examples - dva primjera
Criterium doc. - kriterijumi dokumentacija
Criteria - kriterija
Vrati zaduzene Primjerke
Session sesija = HibernateUtil.getSessionFactory().getCurrentSession();
sesija.beginTransaction();
List<Primerak> lista = new ArrayList<Primerak>();
Query upit = sesija.createQuery("select p from Primerak as p join p.knjiga as k join p.zaduzenjes as z"
+ " where z.datumVracanja is null");
lista = upit.list();
sesija.getTransaction().commit();
List<Knjiga> getKnjigeForZaduzenjeKategorija(Date od, Date doK, Kategorija kat)
Session sesija = HibernateUtil.getSessionFactory().getCurrentSession();
sesija.beginTransaction();
List<Knjiga> lista = new ArrayList<Knjiga>();
Query upit = sesija.createQuery("select k from Knjiga as k " +
"join k.primeraks as p join p.zaduzenjes as z where z.clan.kategorija = :kat " +
"and z.datumZaduzenja >= :od and z.datumZaduzenja <= :doK");
upit.setParameter("kat", kat);
upit.setParameter("od", od);
upit.setParameter("doK", doK);
lista = upit.list();
sesija.getTransaction().commit();
List<Knjiga> findKnjigeby (String izdavac, String godinaIzdanja)
Session sesija = HibernateUtil.getSessionFactory().getCurrentSession();
sesija.beginTransaction();
List<Knjiga> lista = new ArrayList<Knjiga>();
Criteria crit = sesija.createCriteria(Knjiga.class);
if (izdavac != null){
crit.add(Restrictions.like("izdavac", izdavac).ignoreCase());
}
if (godinaIzdanja != null){
crit.add(Restrictions.like("godinaIzdanja", godinaIzdanja).ignoreCase());
}
lista = crit.list();
sesija.getTransaction().commit();
List<Clan> getPrezaduzeniClanovi(int maxZaduzenje)
Session sesija = HibernateUtil.getSessionFactory().getCurrentSession();
sesija.beginTransaction();
List<Clan> lista = new ArrayList<Clan>();
Query upit = sesija.createQuery("select c from Clan c join c.zaduzenjes as z " +
"where z.datumVracanja is null " +
"group by c having count(z) > :maxZ");
upit.setInteger("maxZ", maxZaduzenje);
lista = upit.list();
sesija.getTransaction().commit();
List<Zaduzenje> getNerazduzenaZaClanskiBroj(int clanskiBroj)
Session sesija = HibernateUtil.getSessionFactory().getCurrentSession();
sesija.beginTransaction();
List<Zaduzenje> lista = new ArrayList<Zaduzenje>();
Query upit = sesija.createQuery("from Zaduzenje z where z.datumVracanja is null and " +
"z.clan.clanskiBroj = :clbroj");
upit.setParameter("clbroj", clanskiBroj);
lista = upit.list();
sesija.getTransaction().commit();
* TODO Zadatak 3 (10 poena)
* Implementirati operaciju koja vraca sve knjige
* koje su u periodu @param datumOd do @param datumDo
* zaduzivane vise od @param minBrZaduzenja puta
public List<Knjiga> getKnjigeBrojZaduzenja(Date datumOd, Date datumDo, int minBrZaduzenja){
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("select k from Knjiga k join k.primeraks p join p.zaduzenjes z " +
"where z.datumZaduzenja > :datumOd and z.datumZaduzenja < :datumDo group by k having count(z)>:minBr");
q.setDate("datumOd", datumOd);
q.setDate("datumDo", datumDo);
q.setInteger("minBr", minBrZaduzenja);
List<Knjiga> knjige = q.list();
session.getTransaction().commit();
return knjige;
}
*TODO Zadatak 1 (5 poena)
* Implementirati operaciju koja pronalazi clana sa zadatim clanskim brojem
* i zaduzuje ga za primerak @param p
* Operacija treba da vrati true ako je clan zaduzen,
* odnosno false ako nije
public boolean zaduziClana(int clanskiBroj, Primerak p){
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Clan c = (Clan) session.get(Clan.class, clanskiBroj);
session.getTransaction().commit();
if(c==null || !isSlobodanPrimerak(p.getInvBroj())) return false;
session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Zaduzenje z = new Zaduzenje();
z.setId(446);
z.setClan(c);
z.setPrimerak(p);
z.setDatumZaduzenja(new Date());
session.save(z);
session.getTransaction().commit();
return true;
}
* TODO Zadatak 2 (5 poena)
* @param invBroj
* @return
public boolean isSlobodanPrimerak(String invBroj){
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("from Zaduzenje z where z.primerak.invBroj like :invBroj and z.datumVracanja is null");
q.setString("invBroj",invBroj);
if(q.list().isEmpty()){
session.getTransaction().commit();
return true;
}else{
session.getTransaction().commit();
return false;
}
}
* Vraca sve clanove cije prezime je jednako @param prezime
* i koji su rodeni u periodu @param datumOd @param datumDo
* @return
public List<Clan> getClanoviPrezimeRodjenje(String prezime, Date datumOd, Date datumDo){
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Criteria criteria = session.createCriteria(Clan.class);
criteria.add(Restrictions.like("prezime", prezime));
criteria.add(Restrictions.between("datumRodjenja", datumOd, datumDo));
List<Clan> clanovi = criteria.list();
session.getTransaction().commit();
return clanovi;
}
* Vraca clanove koji imaju nerazduzenih zaduzenja
* pre @param datumDo
* @return
public List<Clan> getZaduzeniClanovi(Date datumDo){
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query = session.createQuery("select c from Clan c join c.zaduzenjes z where " +
"z.datumZaduzenja< :datumDo and z.datumVracanja is null");
query.setDate("datumDo", datumDo);
List<Clan> clanovi = query.list();
session.getTransaction().commit();
return clanovi;
}
* TODO Zadatak 2 (10 poena)
* Implementirati operaciju koja vraca sve clanove kategorije
* @param kat koji su u periodu @param datumOd do @param datumDo
* imali vise od @param minBrZaduzenja zaduzenja
public List<Clan> getClanoviBrojZaduzenja(Kategorija kat, Date datumOd, Date datumDo, int minBrZaduzenja){
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query = session.createQuery("select c from Clan c join c.zaduzenjes z where c.kategorija = :kat " +
"and z.datumZaduzenja> :d1 and z.datumZaduzenja < :d2 group by c having count(z) > :min ");
query.setEntity("kat", kat);
query.setDate("d1", datumOd);
query.setDate("d2", datumDo);
query.setInteger("min", minBrZaduzenja);
List<Clan> result = query.list();
return result;
}
* TODO Zadatak 1 (10 poena)
* Implementirati operaciju koja pronalazi primerak sa inventarnim brojem
* @param invBroj
* i zaduzuje ga za clana @param c
* pri tome treba voditi racuna
* da primerak ne moze biti dva puta zaduzen i
* da clan ne moze imati vise od tri nerazduzena zaduzenja
* Operacija treba da vrati true ako je clan zaduzen,
* odnosno false ako nije
public boolean zaduziClana(String invBroj, Clan c){
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Primerak p = (Primerak)session.get(Primerak.class, invBroj);
if(p==null){
session.getTransaction().commit();
return false;
}
Query queryZaduzenjaPrimerak = session.createQuery(
"select z from Zaduzenje z where z.primerak = :primerak and z.datumVracanja is null");
queryZaduzenjaPrimerak.setEntity("primerak", p);
Query queryZaduzenjaClan = session.createQuery(
"select z from Zaduzenje z where z.clan = :clan and z.datumVracanja is null");
queryZaduzenjaClan.setEntity("clan", c);
if((queryZaduzenjaPrimerak.list().size() > 0) || (queryZaduzenjaClan.list().size() > 3)){
session.getTransaction().commit();
return false;
}
else{
Zaduzenje zaduzenje = new Zaduzenje();
zaduzenje.setId(9990);
zaduzenje.setPrimerak(p);
zaduzenje.setClan(c);
zaduzenje.setDatumZaduzenja(new Date());
session.saveOrUpdate(zaduzenje);
session.getTransaction().commit();
return true;
}
}
* TODO 2. (12 poena) Implementirati operaciju
* koja vraca sve clanove koji su knjigu sa istim autorom i naslovom
* zaduzili vise od @param brZaduzenja puta
public static List<Clan> getClanoviForBrojZaduzenja(int brZaduzenja){
try{
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query = session.createQuery("select c from Clan c join c.zaduzenjes z " +
"group by c,z.primerak.knjiga.naslov,z.primerak.knjiga.autor having count(z) > :min ");
query.setInteger("min", brZaduzenja);
List<Clan> result = query.list();
return result;
}catch(Exception e){
return null;
}
}
* TODO 1. (8 poena) Koriscenjem upita prema kriterijumu
* implementirati operaciju koja vraca sve knjige koje imaju
* primerke i ciji naslov sadrzi podstring @param naslov deo
* Rezultujuce knjige sortirati po naslovu
public static List<Knjiga> getKnjigeZaDeoNaslova(String naslovDeo){
try{
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Criteria crit = session.createCriteria(Knjiga.class);
crit.add(Restrictions.like("naslov", naslovDeo, MatchMode.ANYWHERE));
crit.add(Restrictions.sizeGt("primeraks", 0));
List<Knjiga> knjigas = crit.list();
session.getTransaction().commit();
return knjigas;
}catch(Exception e){
return null;
}
}
List<Primerak> list = getZaduzeniPrimerci();
for (Primerak p:list){
System.out.println(p.getInvBroj() + " " + p.getKnjiga().getNaslov());
}
<set name="primeraks" table="PRIMERAK" inverse="true" lazy="true" fetch="select">
<key>
<column name="ID_KNJIGE" />
</key>
<one-to-many class="rs.ac.uns.dmi.is2.dbmodel.Primerak" />
</set>
<many-to-one name="knjiga" class="rs.ac.uns.dmi.is2.dbmodel.Knjiga" fetch="select" lazy="false">
<column name="ID_KNJIGE" />
</many-to-one>
PARSIRANJE DATUMA
static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
static Date date = new Date();
static Date datumod;
static Date datumdo;
try{
datumod = sdf.parse("2013-03-03");
datumdo = sdf.parse("2013-03-12");
}catch(Exception e){
e.printStackTrace();
}
public static int updateClan(int clanskiBroj, String ime, String prezime, String adresa, Kategorija kategorija, Date datum1){
try{
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Clan c = new Clan();
c.setClanskiBroj(clanskiBroj);
c.setIme(ime);
c.setPrezime(prezime);
c.setAdresa(adresa);
c.setDatumRodjenja(datum1);
c.setDatumUpisa(date);
c.setKategorija(kategorija);
c.setZaduzenjes(null);
session.save(c);
session.getTransaction().commit();
return clanskiBroj;
} catch(Exception e) {
e.printStackTrace();
return 0;
}
}
public static int createAndStoreClan(String ime, String prezime, String adresa, Kategorija kategorija, Date datum1){
try{
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Clan c = new Clan();
c.setIme(ime);
c.setPrezime(prezime);
c.setAdresa(adresa);
c.setDatumRodjenja(datum1);
c.setDatumUpisa(date);
c.setKategorija(kategorija);
c.setZaduzenjes(null);
Integer clanskiBroj = (Integer) session.save(c);
session.getTransaction().commit();
return clanskiBroj;
} catch(Exception e) {
e.printStackTrace();
return 0;
}
}
KOLOKVIJUM ODRZAN 04.02.2013 GRUPA 1
Resenje prvog zadatka ne radi ako budete pokusavali da pokrenete u eclipse-u jer se to sada radi na drugi nacin ali je profesorica prihvatila jer nam to ona nije pokazala kako treba ustvari, greska je boldirana i podvucena.
* TODO 1. (8 poena) Koriscenjem upita prema kriterijumu implementirati
* operaciju koja vraca sva razduzena zaduzenja za koje vazi barem jedan od
* dva uslova: - zaduzenje se odnosi na knjige koja u naslovu sadrze @param
* naslovDeo - zaduzenje je izvrseno u periodu @param datumOd - @param
* datumDo
public static List<Zaduzenje> getZaduzenjaZaNaslov(String naslovDeo,
Date datumOd, Date datumDo) {
try {
Session session = HibernateUtil.getSessionFactory()
.getCurrentSession();
session.beginTransaction();
List<Zaduzenje> lista = new ArrayList<Zaduzenje>();
Criteria crit = session.createCriteria(Zaduzenje.class);
Criterion lhs = Restrictions.like("primerak.knjiga.naslov",
naslovDeo, MatchMode.ANYWHERE);
Criterion rhs = Restrictions.between("datumZaduzenja", datumOd,
datumDo);
crit.add(Restrictions.isNotNull("datumVracanja"));
crit.add(Restrictions.or(lhs, rhs));
lista = crit.list();
if (lista.isEmpty()) {
System.out.println("Rezultat upita je prazan!");
return null;
}
session.getTransaction().commit();
return lista;
} catch (Exception e) {
System.out.println("Doslo je do greske!");
e.printStackTrace();
return null;
}
}
* TODO 2. (12 poena) Implementirati operaciju koja vraca sve primerke koji
* su istog dana bili greskom zaduzeni vise puta
public static List<Primerak> pronadjiGreskomZaduzene() {
try {
Session session = HibernateUtil.getSessionFactory()
.getCurrentSession();
session.beginTransaction();
List<Primerak> result = new ArrayList<Primerak>();
Query query = session
.createQuery("select p from Primerak p join p.zaduzenjes z where z.datumVracanja is null"
+ " or (z.datumZaduzenja != z.datumVracanja)"
+ " group by p, z.datumZaduzenja, z.datumVracanja having count(z) > 1");
result = query.list();
if (result.isEmpty()) {
System.out.println("Rezultat upita je prazan!");
return null;
}
return result;
} catch (Exception e) {
System.out.println("Doslo je do greske!");
e.printStackTrace();
return null;
}
}
Kolokvijum odrzan 05.04.2013 god, zadaci su bez resenja to je za vjezbu ukoliko ko bude isao na porpavni ako ko ima resenja neka postavi u komentaru dole...
* TODO 2. (14 poena)
* Implementirati operaciju
* koja zaduzuje clana sa clanskim brojem @param clanskiBroj
* za vise primeraka datih u listi @param invBrojevi pri tom izvrsiti sledece provere:
*
* - clan kategorije student moze zaduziti maksimalno 5 primeraka
* - clanovi ostalih kategorija mogu da zaduze najvise 3 primerka
* - da bi se primerak zaduzio on mora biti slobodan
*
* Ukoliko su ispunjeni uslovi, zaduzenja sacuvati u bazi i vratiti izgenerisane primarne kljuceve
public static List<Integer> zaduzi(int clanskiBroj, List<Integer> invBrojevi){ return null; }
* TODO 1. (6 poena)
* Koriscenjem upita prema kriterijumu
* implementirati operaciju koja vraca sve knjige
* za koje vazi barem jedan od dva uslova:
* - izdavac im se nalazi u listi @param izdavaci
* - naslov ne sadrzi string @param naslovDeo
public static List<Knjiga> getKnjigeZaIzdavace(List<String> izdavaci, String naslovDeo){ return null; }
List<Primerak> list = getZaduzeniPrimerci();
for (Primerak p:list){
System.out.println(p.getInvBroj() + " " + p.getKnjiga().getNaslov());
}
<set name="primeraks" table="PRIMERAK" inverse="true" lazy="true" fetch="select">
<key>
<column name="ID_KNJIGE" />
</key>
<one-to-many class="rs.ac.uns.dmi.is2.dbmodel.Primerak" />
</set>
<many-to-one name="knjiga" class="rs.ac.uns.dmi.is2.dbmodel.Knjiga" fetch="select" lazy="false">
<column name="ID_KNJIGE" />
</many-to-one>
PARSIRANJE DATUMA
static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
static Date date = new Date();
static Date datumod;
static Date datumdo;
try{
datumod = sdf.parse("2013-03-03");
datumdo = sdf.parse("2013-03-12");
}catch(Exception e){
e.printStackTrace();
}
public static int updateClan(int clanskiBroj, String ime, String prezime, String adresa, Kategorija kategorija, Date datum1){
try{
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Clan c = new Clan();
c.setClanskiBroj(clanskiBroj);
c.setIme(ime);
c.setPrezime(prezime);
c.setAdresa(adresa);
c.setDatumRodjenja(datum1);
c.setDatumUpisa(date);
c.setKategorija(kategorija);
c.setZaduzenjes(null);
session.save(c);
session.getTransaction().commit();
return clanskiBroj;
} catch(Exception e) {
e.printStackTrace();
return 0;
}
}
public static int createAndStoreClan(String ime, String prezime, String adresa, Kategorija kategorija, Date datum1){
try{
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Clan c = new Clan();
c.setIme(ime);
c.setPrezime(prezime);
c.setAdresa(adresa);
c.setDatumRodjenja(datum1);
c.setDatumUpisa(date);
c.setKategorija(kategorija);
c.setZaduzenjes(null);
Integer clanskiBroj = (Integer) session.save(c);
session.getTransaction().commit();
return clanskiBroj;
} catch(Exception e) {
e.printStackTrace();
return 0;
}
}
KOLOKVIJUM ODRZAN 04.02.2013 GRUPA 1
Resenje prvog zadatka ne radi ako budete pokusavali da pokrenete u eclipse-u jer se to sada radi na drugi nacin ali je profesorica prihvatila jer nam to ona nije pokazala kako treba ustvari, greska je boldirana i podvucena.
* TODO 1. (8 poena) Koriscenjem upita prema kriterijumu implementirati
* operaciju koja vraca sva razduzena zaduzenja za koje vazi barem jedan od
* dva uslova: - zaduzenje se odnosi na knjige koja u naslovu sadrze @param
* naslovDeo - zaduzenje je izvrseno u periodu @param datumOd - @param
* datumDo
public static List<Zaduzenje> getZaduzenjaZaNaslov(String naslovDeo,
Date datumOd, Date datumDo) {
try {
Session session = HibernateUtil.getSessionFactory()
.getCurrentSession();
session.beginTransaction();
List<Zaduzenje> lista = new ArrayList<Zaduzenje>();
Criteria crit = session.createCriteria(Zaduzenje.class);
Criterion lhs = Restrictions.like("primerak.knjiga.naslov",
naslovDeo, MatchMode.ANYWHERE);
Criterion rhs = Restrictions.between("datumZaduzenja", datumOd,
datumDo);
crit.add(Restrictions.isNotNull("datumVracanja"));
crit.add(Restrictions.or(lhs, rhs));
lista = crit.list();
if (lista.isEmpty()) {
System.out.println("Rezultat upita je prazan!");
return null;
}
session.getTransaction().commit();
return lista;
} catch (Exception e) {
System.out.println("Doslo je do greske!");
e.printStackTrace();
return null;
}
}
* TODO 2. (12 poena) Implementirati operaciju koja vraca sve primerke koji
* su istog dana bili greskom zaduzeni vise puta
public static List<Primerak> pronadjiGreskomZaduzene() {
try {
Session session = HibernateUtil.getSessionFactory()
.getCurrentSession();
session.beginTransaction();
List<Primerak> result = new ArrayList<Primerak>();
Query query = session
.createQuery("select p from Primerak p join p.zaduzenjes z where z.datumVracanja is null"
+ " or (z.datumZaduzenja != z.datumVracanja)"
+ " group by p, z.datumZaduzenja, z.datumVracanja having count(z) > 1");
result = query.list();
if (result.isEmpty()) {
System.out.println("Rezultat upita je prazan!");
return null;
}
return result;
} catch (Exception e) {
System.out.println("Doslo je do greske!");
e.printStackTrace();
return null;
}
}
Kolokvijum odrzan 05.04.2013 god, zadaci su bez resenja to je za vjezbu ukoliko ko bude isao na porpavni ako ko ima resenja neka postavi u komentaru dole...
* TODO 2. (14 poena)
* Implementirati operaciju
* koja zaduzuje clana sa clanskim brojem @param clanskiBroj
* za vise primeraka datih u listi @param invBrojevi pri tom izvrsiti sledece provere:
*
* - clan kategorije student moze zaduziti maksimalno 5 primeraka
* - clanovi ostalih kategorija mogu da zaduze najvise 3 primerka
* - da bi se primerak zaduzio on mora biti slobodan
*
* Ukoliko su ispunjeni uslovi, zaduzenja sacuvati u bazi i vratiti izgenerisane primarne kljuceve
public static List<Integer> zaduzi(int clanskiBroj, List<Integer> invBrojevi){ return null; }
* TODO 1. (6 poena)
* Koriscenjem upita prema kriterijumu
* implementirati operaciju koja vraca sve knjige
* za koje vazi barem jedan od dva uslova:
* - izdavac im se nalazi u listi @param izdavaci
* - naslov ne sadrzi string @param naslovDeo
public static List<Knjiga> getKnjigeZaIzdavace(List<String> izdavaci, String naslovDeo){ return null; }