Enterprise Experte

JDBC-ResultSet-Mapping vs. JPA-Criteria-API

Ersetze manuelles JDBC-ResultSet-Mapping durch die typsichere Criteria-API von JPA für dynamische Abfragen.

✕ 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();
}
Problem mit diesem Code entdeckt? Sag uns Bescheid.
🔒

Typsichere Abfragen

Der Criteria-Builder erkennt fehlerhafte Feldnamen und Typfehler zur Kompilierzeit.

🗺️

Automatisches Mapping

JPA bildet Ergebniszeilen auf Entity-Objekte ab — kein manuelles Spalte-für-Spalte-Extrahieren.

🧩

Kombinierbare Prädikate

Dynamische WHERE-Klauseln lassen sich sauber mit and(), or() und wiederverwendbaren Predicate-Objekten aufbauen.

Alter Ansatz
JDBC ResultSet
Moderner Ansatz
JPA Criteria API
Seit JDK
11
Schwierigkeitsgrad
Experte
JDBC-ResultSet-Mapping vs. JPA-Criteria-API
Verfügbar

Weitgehend verfügbar seit Jakarta EE 8 / Java 11

Rohes JDBC erfordert das Aufbauen von SQL-Strings, das Setzen von Parametern per Index und das manuelle Mappen jeder ResultSet-Spalte — ein fehleranfälliger Prozess, der bei Spaltenänderungen stillschweigend bricht. Die JPA-Criteria-API erstellt Abfragen programmatisch mit einem typsicheren Builder-Muster. Spaltennamen werden gegen das Entity-Modell validiert, das Ergebnis-Mapping erfolgt automatisch, und komplexe dynamische Abfragen lassen sich ohne Stringverkettung sauber zusammenstellen.

Teilen 𝕏 🦋 in