Enterprise Avanzato

Sostituisci il mapping manuale JDBC ResultSet con l'API Criteria type-safe di JPA per le query dinamiche.

✕ 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();
}
Vedi un problema con questo codice? Faccelo sapere.
🔒

Query type-safe

Il builder Criteria rileva i nomi dei campi e le mancate corrispondenze di tipo in fase di compilazione.

🗺️

Mapping automatico

JPA mappa le righe dei risultati in oggetti entità — nessuna estrazione manuale colonna per colonna.

🧩

Predicati componibili

Le clausole where dinamiche si costruiscono in modo pulito con and(), or() e oggetti Predicate riutilizzabili.

Approccio Vecchio
JDBC ResultSet
Approccio Moderno
API Criteria JPA
Dal JDK
11
Difficoltà
Avanzato
Mapping JDBC ResultSet vs API Criteria JPA
Disponibile

Ampiamente disponibile da Jakarta EE 8 / Java 11

Il JDBC grezzo richiede la costruzione di stringhe SQL, l'impostazione dei parametri per indice e il mapping manuale di ogni colonna ResultSet — un processo soggetto a errori che si rompe silenziosamente quando le colonne cambiano. L'API Criteria JPA costruisce query programmaticamente usando un pattern builder type-safe. I nomi delle colonne vengono validati rispetto al modello entità, il mapping dei risultati è automatico e le query dinamiche complesse si compongono in modo pulito senza concatenazione di stringhe.

Condividi 𝕏 🦋 in