Mapeo de JDBC ResultSet vs API Criteria de JPA
Reemplaza el mapeo manual de JDBC ResultSet por la API Criteria de JPA con seguridad de tipos para consultas dinámicas.
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);
}
}
@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();
}
Consultas con seguridad de tipos
El builder Criteria detecta errores de nombres de campo y tipos incompatibles en tiempo de compilación.
Mapeo automático
JPA mapea las filas del resultado a objetos entidad — sin extracción manual columna por columna.
Predicados componibles
Las cláusulas where dinámicas se construyen limpiamente con and(), or() y objetos Predicate reutilizables.
Ampliamente disponible desde Jakarta EE 8 / Java 11
JDBC crudo requiere construir cadenas SQL, establecer parámetros por índice y mapear cada columna del ResultSet manualmente — un proceso propenso a errores que falla silenciosamente cuando las columnas cambian. La API Criteria de JPA construye consultas programáticamente usando un patrón builder con seguridad de tipos. Los nombres de columnas se validan contra el modelo de entidad, el mapeo de resultados es automático y las consultas dinámicas complejas se componen limpiamente sin concatenación de cadenas.