Monday 1 April 2013

IS2 - HQL Query and Criteria - Examples


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; }