Omet navegació

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 XQPreparedExpression:

import javax.xml.xquery.XQConnection;
import javax.xml.xquery.XQDataSource;
import javax.xml.xquery.XQException;
import javax.xml.xquery.XQPreparedExpression;
import javax.xml.xquery.XQResultSequence;
 
import net.xqj.exist.ExistXQDataSource;
 
 
public class Prova1_XQJ {
 
public static void main(String[] args) throws XQException {
XQDataSource s = new ExistXQDataSource();
   s.setProperty("serverName", "localhost");
   s.setProperty("port", "8080");
   s.setProperty("user", "admin");
   s.setProperty("password", "admin");
 
   XQConnection conn = s.getConnection();
   System.out.println("Connexió feta");
   String sent ="for $alumne in doc(\"/db/Tema8/classe.xml\")//alumne order by $alumne/cognoms return $alumne";
   
   XQPreparedExpression cons = conn.prepareExpression(sent);
   XQResultSequence rs = cons.executeQuery();
   
while(rs.next())
       System.out.println(rs.getItemAsString(null));
 
   conn.close();
}
}

I ara anem a canviar la consulta per veure com queda amb XQExpression


...
 
   XQExpression cons = conn.createExpression();
   XQResultSequence rs = cons.executeQuery(sent);
   while(rs.next())
       System.out.println(rs.getItemAsString(null));
 
...
 

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:

import javax.xml.xquery.XQConnection;
import javax.xml.xquery.XQDataSource;
import javax.xml.xquery.XQException;
import javax.xml.xquery.XQPreparedExpression;
import javax.xml.xquery.XQResultItem;
import javax.xml.xquery.XQResultSequence;
 
import net.xqj.exist.ExistXQDataSource;
 
 
public class Prova2_XQJ {
 
public static void main(String[] args) throws XQException {
XQDataSource s = new ExistXQDataSource();
   s.setProperty("serverName", "localhost");
   s.setProperty("port", "8080");
   s.setProperty("user", "admin");
   s.setProperty("password", "admin");
 
   XQConnection conn = s.getConnection();
   String sent ="for $alumne in doc(\"/db/Tema8/classe.xml\")//alumne order by $alumne/cognoms return $alumne";
   
   XQPreparedExpression cons = conn.prepareExpression(sent);
   XQResultSequence rs = cons.executeQuery();
   
XQResultItem r_item=null;
   while(rs.next()){
    r_item = (XQResultItem) rs.getItem();
    System.out.println(r_item.getItemAsString(null));
   }
   conn.close();
}
}