8.3 - Càrrega d'objectes: mètodes load() i get()
La càrrega d'objectes s'aconsegueix amb els mètodes load() i get(). Són similars excepte en una qüestió: el primer dóna un error si no es troba la fila, mentre que el segon contindrà null. A més a partir d'Hibernate 6.0 load està deprecated, així que millor uilitzar get .
Tant si utilitzem un com l'altre, haurem d'especificar 2 paràmetres: la classe que volem buscar, i el valor de la clau principal de qui volem trobar. Aquest valor s'ha de passar amb el mateix tipus que la propietat corresponent a la clau principal, i en moltes ocasions haurem de canviar de tipus (cast). En el següent exemple, molt paregut al ja utilitzat anteriorment en SegonAcces, trobem la comarca Alt Maestrat (valor de nom_c, que correspon a la clau principal). En aquesta ocasió no cal canviar de tipus, ja que és string:
val sessio = Configuration().configure().buildSessionFactory().openSession()
val com = sessio.get("classes.Comarca","Alt Maestrat") as Comarca // càrrega amb mètode load()
println("Comarca " + com.nomC + ": " + com.provincia)
sessio.close()
Com comentàvem, si no existira la comarca Alt Maestrat, donaria un error. Ací tenim el mateix exemple, però utilitzant el mètode get() i comprovant després si com és null, i així esquivem l'error:
val sessio = Configuration().configure().buildSessionFactory().openSession()
val com = sessio.get("classes.Comarca","Al Maestrat") as Comarca? // càrrega amb mètode get()
if (com==null)
println("No existeix la comarca");
else {
println("Comarca " + com.nomC + ": " + com.provincia)
}
sessio.close()
Només hem tingut la dificultat d'haver de posar Comarca? per si és null el resultat de la consulta (justament el que volem comprovar)
Anem a mirar la potencialitat que ens proporciona la manera que té Hibernate de construir les classes, amb el conjunt (o col·lecció) de poblacions que té un objecte de la classe Comarca.
Els Set es poden recórrer de més d'una manera. Una molt estesa és utilitzar un iterator, utilitzant els mètodes hasNext() que ens diu si hi ha més elements en la col·lecció, i next() que torna el següent element de la col·lecció. En el següent programa anem a visualitzar informació de la comarca de l'Alcalatén, i també els seus pobles. Estan marcades les línies de la utilització del Iterator. Copieu-lo en un fitxer Kotlin anomenat Exemple_03_TercerAcces.kt :
package exemples
import classes.Comarca
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 com = sessio.get("classes.Comarca", "Alcalatén") as Comarca
print("La comarca " + com.nomC)
print(" (província de " + com.provincia + ") ")
println("té " + com.poblacions.size + " pobles")
println()
println("Llista de pobles")
println("-----------------")
val it = com.poblacions.iterator()!!
while (it.hasNext()) {
val p = it.next()
System.out.println(p.nom + " (" + p.poblacio + " habitants)")
}
sessio.close()
}
Però més senzilla encara és la utilització del bucle foreach, que fa el recorregut ell sol, tenint disponible cada element. La sintaxi en Kotlin pot ser de dues maneres. Posem com queda l'exemple anterior de cadascuna de les dues maneres
- for (e in conjunt) i e anirà agafant tots els valors de la col·lecció.
for (p in com.poblacions!!) {
println(p.nom + " (" + p.poblacio + " habitants)")
}
- conjunt.forEach() i dins dels parèntesis utilitzem cada element com it
com.poblacions!!.forEach {
println(it.nom + " (" + it.poblacio + " habitants)")
}
Utilitzarem la primera forma, que és la més còmoda, i quedarà de la següent manera. Guardeu el següent programa en fitxer Kotlin anomenat Exemple_04_QuartAcces.kt :
package exemples
import classes.Comarca
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 com = sessio.get("classes.Comarca", "Alcalatén") as Comarca
print("La comarca " + com.nomC)
print(" (província de " + com.provincia + ") ")
println("té " + com.poblacions.size + " pobles")
println()
println("Llista de pobles")
println("-----------------")
for (p in com.poblacions) {
println(p.nom + " (" + p.poblacio + " habitants)")
}
sessio.close()
}
En ambdós, tant en TercerAcces com en QuartAcces casos el resultat haurà estat:
La comarca Alcalatén (província de Castelló) té 9 pobles
Llista de pobles
-----------------
Llucena (1417 habitants)
Useres, les (992 habitants)
Figueroles (549 habitants)
Costur (562 habitants)
Xodos (126 habitants)
Alcora, l' (10672 habitants)
Atzeneta del Maestrat (1321 habitants)
Vistabella del Maestrat (384 habitants)
Benafigos (156 habitants)
Com veieu apareixen tots els pobles de la comarca que hem llegit, però com és un conjunt (Set) no podem assegurar l'ordre. De fet, podria ser que a cadascú de nosaltres li apareguen els pobles en ordre distint.
Estaria bé que aparegueren ordenats. Sempre ho podríem fer per mig d'una consulta i ordenar pel nom de la població com veurem més avant. Però si ens interessa que els pobles apareguen sempre ordenats, podem fer una altra cosa: modificant el fitxer de mapatge, li podem dir que ens apareguen sempre ordenats per un camp. Ho havíem comentat en la pregunta 7, i ara anem a aplicar-lo.
Per mig d'una senzilla indicació en el fitxer de mapatge Comarca.hbm.xml, podem fer que les dades ens vinguen ordenades, és a dir, que les poblacions d'una comarca ens vinguen per ordre alfabètic. Senzillament serà posar order-by="nom" en la definició del set poblacions.
És a dir hauríem de substituir la línia
<set name="poblacions" inverse="true">
per
<set name="poblacions" inverse="true" order-by="nom">
I així li estem dient que les poblacions vinguen ordenades per nom, que és el camp de la taula POBLACIO pel qual ens interessa ordenar.
Només fent aquesta modificació, el resultat tant del programa TercerAcces com el de QuartAccess serà:
La comarca Alcalatén (província de Castelló) té 9 pobles
Llista de pobles
-----------------
Alcora, l' (10672 habitants)
Atzeneta del Maestrat (1321 habitants)
Benafigos (156 habitants)
Costur (562 habitants)
Figueroles (549 habitants)
Llucena (1417 habitants)
Useres, les (992 habitants)
Vistabella del Maestrat (384 habitants)
Xodos (126 habitants)
Llicenciat sota la Llicència Creative Commons Reconeixement NoComercial CompartirIgual 2.5