# Hibernate III: HQL ### Idea general Hibernate suporta un llenguatge de consulta orientat a objectes denominat HQL (Hibernate Query Language) Les consultes HQL i SQL són representades amb una instància d'org.hibernate.query.Query . Aquesta interfície Query ofereix mètodes per a lligar paràmetres, control del conjunt resultat i per l'execució de la consulta real. Sempre s'obté una Query utilitzant l'objecte Session actual. ### Recuperació d'objectes simples Dins l’aplicació podrem emprar la interfície query i, per recuperar objectes simples, fem ús de createQuery, el qual en la darrera versió d'hibernate ha patit canvis i ha deprecat algunes formes d'ús. Així, amb les darreres recomanacions: ``` Session sesion1 = HibernateUtil.getSessionFactory().getCurrentSession(); /../ Query<Alumne> q = sesion1.createQuery(“Select a from Alumne a where a.nomAlumne like “%Pere%” ”,Alumne.class); List<Alumne> alumnes = q.list(); for (Alumne a : alumnes) { System.out.println(a); } ``` El mètode list() retorna una col·lecció de tots els resultats de la consulta. En la col·lecció es troben instanciades totes les entitats que corresponen al resultat de l'execució de la consulta. Si la quantitat de resultats és extensa, el retard de l'accés a la bbdd ser notori. En el cas que volguèssim recuperar un únic resultat (com per exemple quan fem servir funcions d'agregració com el count, sum, etc.), podem fer el següent: ``` Query<Alumne> q = laSesion.createQuery(“Select a from Alumne a where a.idAlumne = 1 ”,Alumne.class); Alumne a = (Alumne)q.uniqueResult(); ``` ### Consultes mixtes En aquells casos en els quals la consulta torna part d’un objecte (alguns atributs), el resultat serà un array d’objectes molt lligat a la pròpia consulta: ``` Session laSesion = HibernateUtil.getSessionFactory().getCurrentSession(); /../ Query<Alumne> q = laSesion.createQuery(“Select a.nomAlumne,a.edat from Alumne a”,Alumne.class); List<Object[ ]> alumnes = q.list(); for (Object[ ] alu : alumnes) { System.out.println(“Alumne amb nom: “ + alu[0] + “ té “ + alu[1] + “ anys”); } ``` ### Consultes amb paràmetres nominals Volem saber ara el nombre d’examens que han superat una determinada qualificació, com per exemple 5. Això ho podem parametritzar i resoldre del següent mode: ``` Session laSesion = HibernateUtil.getSessionFactory().getCurrentSession(); /../ Query<Examen> q=laSesion.createQuery("select count(e) from Examen e where e.nota> :nota",Examen.class); q.setParameter("nota",5); Long n=(Long) q.uniqueResult(); System.out.println(n.intValue()); ``` Fixeu-vos que hem fet ús del mètode setParameter, amb el qual hem declarat (i assignat valor) al paràmetre nota, utilitzat a la query. Hem posat 5, però es podria utilitzar una variable del mateix tipus de nota que demanem per pantalla o per consola. ### Altres mètodes * Query setFetchSize (int size) → Fixa el nombre de resultats a recuperar en cada accés a la base de dades al valor indicat en size. Exemple d'ús: Limitem a 10 registres. ``` Query<Alumne> q = sesion1.createQuery(“Select a from Alumne a where a.nomAlumne like “%Pere%” ”,Alumne.class); q.setFetchSize(10) ``` * int executeUpdate() → Executa la sentència de modificació o esborrat (UPDATE o DELETE). Retorna el nombre d'entitats afectades ``` Query<Modulo> q = sesion.createQuery("update Modulo set nombre='M03' where idModulo = 6"); int result = q.executeUpdate(); sesion.getTransaction().commit(); ``` * String getQueryString() → Retorna la consulta en un string. ``` Query<Alumne> q = sesion1.createQuery(“Select a from Alumne a where a.nomAlumne like “%Pere%” ”,Alumne.class); q.getQueryString(); ```