Java Enterprise Tutorial – Named query parametriche

Nel seguente tutorial non porremo troppa attenzione sugli aspetti riguardandi l’IDE o la creazione di file e classi ma solo sugli aspetti più dettagliati del codice, di conseguenza si presume che il lettore dovrebbe già avere una conoscenza di base del contesto Enterprise.
Se volete un’infarinatura potete seguire il tutorial base sul mio blog.
Vi ricordo, inoltre, che il progetto di esempio e tutti i riferimenti all’ambiente di sviluppo sono da riverirsi a l’IDE Netbeans 6.5.

Dopo l’introduzione alle named query, vediamo più nel dettaglio il loro funzionamento.
Nel caso volessimo una classica query di selezione, discriminando in base ad uno o più valori, possiamo preparare una named query personalizzata che accetti i parametri necessari.
Facendo sempre riferimento al progetto oggetto del tutorial di introduzione alle named query modifichiamo l’entity bean “Users” aggiungendo una named query per eseguire una LIKE sul campo name.
Sriviamo la query in questo modo aggiungendola alla lista delle altre named query ricordandoci che il separatore tra le named query è la virgola.

@NamedQuery(name = "Users.like", query = "SELECT u FROM Users u WHERE u.name LIKE :name")

Come si può notare la stringa :name verrà sostituita dal parametro che andremo a settare prima dell’esecuzione della query, utilizzando l’etichetta “name” potremo infatti assegnare un valore arbitrario.
Volendo avremmo anche potuto mettere al posto della stringa :name la stringa :1 utilizzando la notazione posizionale e quindi passare i parametri in ordine invece che in base ad un etichetta.

Una volta aggiunta la nostra named query prepariamo un metodo per richiamarla in un session bean, utilizziamo sempre lo stesso bean chiamato “UserServeBean” e creiamo un metodo UsersLike così scritto.

public List UsersLike(String value){
EntityManager em=emf.createEntityManager();
Query q=em.createNamedQuery("Users.like");
q.setParameter("name", value);
List l=q.getResultList();
return l;
}

Poniamo la nostra attenzione sulla riga q.setParameter(“name”, value); in questo modo andiamo a settare all’etichetta “name” il valore passato al metodo identificato dalla variabile value.
Per verificare il corretto funzionamento della query creiamo una servlet che invocherà il metodo, chiamiamola UsersLike, essa rivecerà un parametro in POST e lo passerà al metodo restituendo la lista dei risultati.

package servlet;
import entity.Users;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import java.util.ListIterator;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import session.UserServeRemote;
/**
*
* @author Mauro the King
*/
public class UsersLike extends HttpServlet {
@EJB
private UserServeRemote userServeBean;
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String value = request.getParameter("value");
try {
List<Users> list = userServeBean.UsersLike(value+"%");
ListIterator<Users> it = list.listIterator();
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet UserList</title>");
out.println("</head>");
out.println("<body>");
if (list.size() == 0) {
out.println("Nessun risultato");
} else {
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>");
} finally {
out.close();
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
public String getServletInfo() {
return "Short description";
}// </editor-fold>
}

Non ci resta che creare una pagina JSP con una bella form che invii in POST una variabile value alla servlet.
Per creare una pagina JSP è sufficiente fare click destro nel WAR project sulla cartella Web Pages e poi ->Nuovo->JSP.
Chiamiamo la pagina searchUser e inseriamo un form con un campo di testo e un pulsante, in questo modo.

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<form action="UsersLike" method="POST">
<input type="text" name="value" size="20"><br>
<input type="submit" value="CERCA">
</form>
</body>
</html>

Ora non ci resta che provare, buildiamo e deployamo il tutto e proviamo a fare una ricerca spostandoci sulla pagina searchUser.jsp, inserite una stringa qualsiasi ricordando che la servlet aggiungerà alla stringa inserita il valore ‘%’ in modo da ottenere come risultato tutti gli utenti che hanno il nome che inizia per la chiave inserita.
Ricordate di scaricare il dump del database usato per questo tutorial ,se non lo avete già fatto, e di inserire qualche record all’interno del db 🙂 prima di effettuare il test.
Potete, come sempre, scaricare il progetto di esempio completo dei contenuti del seguente tutorial.