Omet navegació

9.1 - Paràmetres en les consultes

createQuery() admet també la utilització de paràmetres, igual que feia les sentències PreparedStatement del tema anterior. La manera de posar-les és prou similar al vist en aquella ocasió. Ara, però, ho ampliarem un poc.

La manera de posar valor als paràmetres serà utilitzant el mètodes setParameter() que tindrà 2 paràmetres, el primer per a assenyalar el paràmetre, i el segon per a indicar el valor. De moment tot igual que en el PreparedStatement

Però ara veurem 2 maneres de posar paràmetres en la consulta:

  • Amb ?i, utilitzant el mètode setParameter(int, valor) i indicant el número el mateix que després de la interrogant (la i).
  • Amb :nom , utilitzant el mètode setParameter(string, valor) i indicant el nom del paràmetre

Ho veurem molt més clar en un exemple, millor dit, en dues versions del mateix exemple. Intentarem traure les poblacions d'una determinada comarca, que tenen una altura determinada o major. I aquestos dos valors els posarem com a paràmetres, i així podrem practicar les dues formes. Els valors que posarem per a la comarca serà Alcalatén, i l'altura 500

En aquesta primera versió assenyalem els paràmetres amb ?i a l'estil de JDBC. Copieu el següent codi al fitxer Exemple_31_ConsultesAmbParametres1.kt

package exemples

import classes.Poblacio
import org.hibernate.cfg.Configuration
import java.util.logging.Level
import java.util.logging.LogManager

fun main(args: Array<String>) {
    LogManager.getLogManager().getLogger("").setLevel(Level.SEVERE)
    val sessio = Configuration().configure().buildSessionFactory().openSession()

    val q = sessio.createQuery("from Poblacio where altura>=?1 and comarca.nomC=?2", Poblacio::class.java)
    q.setParameter(1, 500)
    q.setParameter(2, "Alcalatén")

    for (p in q.list()) {
        p as Poblacio
        println(p.nom + " - " + p.altura)
    }

    sessio.close()
}

Nota

En versions anteriors a banda de setParameter() s'utilitzaven els mètodes setInteger(), setString()... però des de la versió 6 d'Hibernate ja no existeixen

En la segona posem els paràmetres de l'altra manera. Copieu el següent codi al fitxer Exemple_32_ConsultesAmbParametres2.kt

package exemples

import classes.Poblacio
import org.hibernate.cfg.Configuration
import java.util.logging.Level
import java.util.logging.LogManager

fun main(args: Array<String>) {
    LogManager.getLogManager().getLogger("").setLevel(Level.SEVERE)
    val sessio = Configuration().configure().buildSessionFactory().openSession()

    val q = sessio.createQuery("from Poblacio where altura>=:alt and comarca.nomC=:com", Poblacio::class.java)
    q.setParameter("alt",500)
    q.setParameter("com","Alcalatén")
    for (p in q.list()) {
        p as Poblacio
        println(p.nom + " - " + p.altura)
    }

    sessio.close()
}