Enterprise Avancé

Remplace le mapping manuel de JDBC ResultSet par l'API Criteria de JPA avec sécurité de types pour les requêtes dynamiques.

✕ Java EE
String sql = "SELECT * FROM users"
    + " WHERE status = ? AND age > ?";
try (Connection con = ds.getConnection();
     PreparedStatement ps =
             con.prepareStatement(sql)) {
    ps.setString(1, status);
    ps.setInt(2, minAge);
    ResultSet rs = ps.executeQuery();
    List<User> users = new ArrayList<>();
    while (rs.next()) {
        User u = new User();
        u.setId(rs.getLong("id"));
        u.setName(rs.getString("name"));
        u.setAge(rs.getInt("age"));
        users.add(u);
    }
}
✓ Jakarta EE 8+
@PersistenceContext
EntityManager em;

public List<User> findActiveAboveAge(
        String status, int minAge) {
    var cb = em.getCriteriaBuilder();
    var cq =
        cb.createQuery(User.class);
    var root = cq.from(User.class);
    cq.select(root).where(
        cb.equal(root.get("status"), status),
        cb.greaterThan(root.get("age"), minAge));
    return em.createQuery(cq).getResultList();
}
Un problème avec ce code ? Dites-le nous.
🔒

Requêtes avec sécurité de types

Le builder Criteria détecte les erreurs de noms de champs et les types incompatibles à la compilation.

🗺️

Mapping automatique

JPA mappe les lignes de résultat en objets entité — sans extraction manuelle colonne par colonne.

🧩

Prédicats composables

Les clauses where dynamiques se construisent proprement avec and(), or() et des objets Predicate réutilisables.

Ancienne Approche
JDBC ResultSet
Approche Moderne
API Criteria de JPA
Depuis JDK
11
Difficulté
Avancé
Mapping de JDBC ResultSet vs API Criteria de JPA
Disponible

Disponible depuis Jakarta EE 8 / Java 11

JDBC brut nécessite de construire des chaînes SQL, de définir des paramètres par index et de mapper chaque colonne du ResultSet manuellement — un processus sujet aux erreurs qui échoue silencieusement quand les colonnes changent. L'API Criteria de JPA construit des requêtes programmatiquement en utilisant un pattern builder avec sécurité de types. Les noms de colonnes sont validés par rapport au modèle d'entité, le mapping des résultats est automatique et les requêtes dynamiques complexes se composent proprement sans concaténation de chaînes.

Partager 𝕏 🦋 in