7.1.3 - Resultats de sentències XQuery
Aquestes són les classes que utilitzarem per accedir a les dades:
XQExpression o XQPreparedExpression
Són objectes creats a partir de la connexió per a l'execució d'una expressió (sentència) XQuery. Ja sabem que XQuery inclou XPath, per tant també podem posar senzillament una expressió XPath.
XQExpression serveix per a executar sentències de forma immediata, si volem una darrere de l'altra. XQPreparedExpression serveix més per a preparar-les, exactament igual que amb els Statement de JDBC per a BD Relacionals.
Mentre que per a XQExpression no declarem la sentència en el moment de crear-la, sinó posteriorment amb executeQuery(sentència) passant-li la sentència, en XQExpression declarem la sentència en el moment de crear-la, i després només restarà executar-la (sense passar-li-la com a paràmetre amb executeQuery().
En ambdós casos el resultat vindrà en un XQResultSequence.
XQResultSequence
Arreplega el resultat de l'execució d'una sentència per qualsevol dels mètodes anteriors. Contindrà un conjunt de 0 o més XQResultItem.
És un objecte que es pot recórrer. Veja'm un exemple, on per a obtenir l'element del ResultSequence utilitzem el mètode getItemAsString(null) per a convertir-lo tot sencer en string. Primer utilitzem XQPrepareExpression:. Copieu el següent codi amb en un fitxer amb el nom Prova1_XQJ.kt. Observeu com ens ha tocat escapar els $ per a que Kotlin no ho interprete com una extensió de les variables
import net.xqj.exist.ExistXQDataSource
fun main() {
val s = ExistXQDataSource()
val conn = s.getConnection()
println("Connexió feta")
val sent = "for \$alumne in doc(\"/db/Tema9/classe.xml\")//alumne order by \$alumne/cognoms return \$alumne"
val cons = conn.prepareExpression (sent)
val rs = cons.executeQuery ()
while (rs.next())
println(rs.getItemAsString(null))
}
I ara anem a canviar la consulta per veure com queda amb XQExpression. Serà substituir les línies 12 i 13 per aquestes:
val cons = conn.createExpression()
val rs = cons.executeQuery(sent)
En els programes anteriors hem buscat en un únic document, classe.xml, posant-li la ruta. Com que per a posar el nom i ruta del document fan falta les cometes ", ens ha tocat "escapar-les" amb la contra-barra. Si no posàrem el document, ja sabem que eXist buscaria en totes les col·leccions.
XQResultItem
Representa un element d'un resultat. Ja hem vist que el XQResultSequence el podem recórrer, però si volem treballar millor o de forma més completa amb cada element, podem passar-lo al XQResultItem. El mateix exemple d'abans quedaria d'aquesta manera. Guardeu el següent codi en el fitxer Prova2_XQJ.kt:
import net.xqj.exist.ExistXQDataSource
import javax.xml.xquery.XQResultItem
fun main() {
val s = ExistXQDataSource()
val conn = s.getConnection()
println("Connexió feta")
val sent = "for \$alumne in doc(\"/db/Tema9/classe.xml\")//alumne order by \$alumne/cognoms return \$alumne"
val cons = conn.prepareExpression(sent)
val rs = cons.executeQuery()
var r_item: XQResultItem? = null
while (rs.next()) {
r_item = rs.getItem() as XQResultItem
println(r_item.getItemAsString(null))
}
}
Llicenciat sota la Llicència Creative Commons Reconeixement NoComercial CompartirIgual 2.5