Java Enterprise Tutorial – Introduzione alle Named Query

Questo tutorial è il naturale proseguimento di “Getting Started 2a parte” si basa sullo stesso progetto e ne andrà ad arricchire il contenuto.
Se non avete seguito i tutorial precedenti potete farlo, oppure scaricare semplicemente il progetto base risultato del tutorial Getting started.
Correlato al progetto vi è anche un dump mysql del db usato nei tutorial che potete scaricare cliccando qui.

Nel seguente tutorial affronteremo come “eseguire delle query” in un contesto enterprise e quindi come ottenere degli elenchi di entità.

Un entity beans può contenere delle query già scritte che possono essere chiamate sull’oggetto tramite un nome univoco all’interno del contesto del container.
Quest’ultime, se generate un’entity class da un db tramite un’IDE come Netbeans, saranno create direttamente dall’IDE, di seguito potete vederne un’esempio.

namedquery1

La classica namedquery che troverete di sicuro in un entity bean appena generato sarà la classica “NomeTabella.findAll” che come potete immagginare farà una semplice query estraendo tutto il contenuto della tabella.
Ora vediamo come chiamare da un session bean questa named query e restituirne il risultato.
E’ gia presente nel progetto la classe UserServeBean nella quale avevamo creato il metodo che creava l’utente, ora andremo a creare un metodo che ci restituirà una lista di tutti gli utenti e naturalmente non possiamo che chiamarlo UserList che ritornerà un ogetto di tipo List.
Come prima cosa all’interno del metodo dobbiamo inizializzare un EntityManager utilizzando la Factory, successivamente inizializziamo un oggetto di tipo Query attraverso l’Em nel modo seguente.

public List UserList(){
EntityManager em=emf.createEntityManager();
Query q=em.createNamedQuery("Users.findAll");

Facciamo atenzione ad importare l’oggetto query del package Persistence altrimenti potreste scervellarvi e pensare che il vostro ide ami troppo le sottolineature rosse.. :-)

import_query

Ora non dobbiamo fare altro che chiedere all’ogetto query appena creato di eseguire l’interrogazione e ritornarci la lista dei risultati.

public List UserList(){
EntityManager em=emf.createEntityManager();
Query q=em.createNamedQuery("Users.findAll");
List l=q.getResultList();
return l;
}

Attenzione! Una volta completato il metodo non dimenticatevi di esporlo sull’interfaccia utile, in questo caso sulla remota.

remote_method1

A questo punto possiamo spostarci sul progetto war e creare una servlet che ci stampi a video la lista ritornata dal metodo.
Tasto destro sul package servlet del progetto Create new->Servlet e nella finestra di dialogo diamo il nome UsersList alla servlet, mi raccomando cliccate su next e ,se non lo è,  selezionate la casella che vi dice di aggiungere la servlet al descriptor.
Ora nel corpo della select richiamiamo il nostro session bean facendo tasto destro->InsertCode->callEnterpriseBean selezionando l’interfaccia remota.
A questo punto inizializziamo un oggetto list chiamando il metodo sul SessionBean che abbiamo creato precedentemente.

List lista=userServeBean.UserList();

A questo punto possiamo processare la lista con un ciclo e stampare l’output a video ricordando che la nostra lista è fatta di ogetti di tipo Users e come tali vanno trattati.

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
List<Users> list=userServeBean.UserList();
ListIterator<Users> it=list.listIterator();
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet UserList</title>");
out.println("</head>");
out.println("<body>");
while(it.hasNext()){
Users temp=it.next();
out.println("<br>-Nome: "+temp.getName()+"<br>-Cognome: "+temp.getSurname()+"<br>-Email: "+temp.getEmail());
out.println("<br>-------------------------------------------------------<br>");
}
out.println("</body>");
out.println("</html>");</code>

} finally {
out.close();
}
}

Ora facciamo un clean and build e poi deployamo il tutto, andiamo all'indirizzo contenente la servlet nel mio caso /UsersList
e se tutto è andato bene dovremmo vedere una pagina come questa.

lista

Potete scaricare l'esempio completo delle aggiunte di questo tutorial qui

Nel prossimo tutorial affronterò il passaggio di parametri alle namedQuery e il modo corretto di crearne di nuove.

  • ekim

    Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘residenza, indirizzo, città, nome, data di nascita, cognome, password, sesso FRO’ at line 1
    Error Code: 1064
    Call: SELECT idutente, stato, email, città di residenza, indirizzo, città, nome, data di nascita, cognome, password, sesso FROM utente WHERE (nome = ?)
    bind => [stefano]

  • ekim

    Qualcuno può aiutarmi?