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;
    }