JPA (Java Persistence API) nous offre aujourd’hui un grand moyen unique et universel (quasiment) de venir communiquer en Java avec une base de données. Le moyen le plus utilisé pour intégrer JPA est apparemment, et selon quelques observations, l’utilisation des annotations. Le but de cet billet n’est pas de venir expliquer JPA ou l’attribut @NamedQuery mais de proposer une bonne pratique dans la manipulation des ces requêtes nommées.
L’annotation @NamedQuery permet la déclaration d’une requête orientée objet. Cette annotation est formée principalement des deux attributs suivants:
- name – le nom de la requête
- query – la requête elle-même
@NamedQuery(name = “findAllExample”, query = “select object(o) from Example o”)
L’attribut “name” est utilisé comme paramétre lorsque vous désirez créer une requête afin de l’éxécuter.
Query query = entityManger.createNamedQuery(“findAllExample”);
Le problème qui peut être rencontré dans ce cas-là est d’obtenir une exception si l’on se trompe dans le nom de la requête. Ceci peut être évité en venant utiliser une classe dite “inner”. Voici son code:
public static class QN {
public static final String FIND_ALL = “findAllExample”;
}
Cette classe doit être de préférence déclarée dans l’entité concernée mais peut être aussi déclarée comme une simple classe. Mais il semble plus intéressant de l’intégrer au sein de l’entité pour des raisons de lisibilité et de design.
Il est nécessaire de changer la déclaration @NamedQuery:
@NamedQuery(name = Example.QN.FIND_ALL, query = “select object(o) from Example o”)
Ainsi du côté client, on ne risque plus de se tromper en utilisant la ligne de code suivante:
Query query = entityManger.createNamedQuery(Example.QN.FIND_ALL);
Cette pratique peut bien entendu être étendue à d’autres cas dans JPA. N’hésitez pas à donner votre opinion.





Il est préférable de commencer le nom des query pas le nom de la classe persisante (les noms des query doivent être unique).
On peut encore un peut simplifier en utilisant les import static en JAVA 5.
import static org.ejb.entity.User.QN.*;
@NamedQueries( {
@NamedQuery(name = FIND_BY_USERID query = “SELECT u FROM User u WHERE u.userid = :userid”)
, @NamedQuery(name = FIND_BY_EMAIL_ID, query = “SELECT u FROM User u WHERE u.emailid = :id”)
})
public class User implements Serializable {
public static class QN {
public static final String FIND_BY_USERID = “User.findByUserid”;
public static final String FIND_BY_EMAIL_ID = “User.findWithEmailId”;
}
Bien vu pour l’import static.