Enterprise 高级

JDBC ResultSet 映射与 JPA Criteria API

用 JPA 类型安全的 Criteria API 替代手动 JDBC ResultSet 映射。

✕ 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();
}
发现此代码有问题? 告诉我们。
🔒

类型安全查询

Criteria 构建器在编译时捕获字段名称和类型不匹配。

🗺️

自动映射

结果直接映射到实体对象——无需手动 ResultSet 处理。

🔧

可重构

重命名字段会在 Criteria 查询中产生编译错误。

旧方式
JDBC ResultSet
现代方式
JPA Criteria API
自 JDK
11
难度
高级
JDBC ResultSet 映射与 JPA Criteria API
可用

自 Jakarta EE 8 / Java 11 起广泛可用

原始 JDBC 需要构建 SQL 字符串、按索引设置参数、手动映射每列。JPA Criteria API 在编译时捕获字段名称和类型不匹配。

分享 𝕏 🦋 in