Une des grosses fonctionnalités qui manque cruellement dans la version JPA1. L'idéee est de créer une requête dynamiquement par rapport aux attributs d'un pojo . Ce genre d'une fonctionnalité peut être utilisé dans les écrans de recherche avancé où l'utilisateur peut insérer un ou plusieurs renseignements.
Si vous n'avez pas comme implémentation JPA Toplink Essentials ou Hibernate, vous devrez donc réaliser à la mimine cette fonctionnalité.
Il y a encore quelques améliorations à réaliser sans doute mais voici le code :
public List<T> findByExample(T example) {
List<T> results = new ArrayList<T>();
StringBuffer queryByExample =
new StringBuffer("select A from ").append(
example.getClass().getSimpleName()).append(" A where ");
Field[] fields = example.getClass().getDeclaredFields();
// on remplit la requete
int numberOfParameters = 0;
final String AND_CLAUSE = " AND ";
try {
for (Field current : fields) {
current.setAccessible(TRUE);
if (!Modifier.isStatic(current.getModifiers())) {
if (current.get(example) != null) {
queryByExample = queryByExample.append(" A.").append(
current.getName()).
append(" = ").
append(":").
append(current.getName()).append(AND_CLAUSE);
numberOfParameters++;
}
}
}
if (queryByExample.substring(queryByExample.length() - AND_CLAUSE.
length()).equalsIgnoreCase(AND_CLAUSE)) {
queryByExample =
queryByExample.delete(queryByExample.length() - AND_CLAUSE.
length() + 1, queryByExample.length());
}
// on peuple la requete
Query query = em.createQuery(queryByExample.toString());
// @TODO: a refactoriser --> copier / coller
for (Field current : fields) {
current.setAccessible(TRUE);
if (!Modifier.isStatic(current.getModifiers())) {
if (current.get(example) != null) {
if (current != null) {
query.setParameter(current.getName(), current.get(example));
}
}
}
}
results = query.getResultList();
} catch (Exception e) {
System.err.println(e.getMessage());
e.printStackTrace();
}
return results;
}




1 réactions
1 De Didier - 13/03/2010, 11:18
Fonctionne uniquement sur des attributs acceptants une valeur null. Pour un attribut de type long, la valeur null n'est pas possible...