Enterprise 上級

JDBC ResultSetマッピングとJPA Criteria APIの比較

手動のJDBC ResultSetマッピングをJPAの型安全なCriteria APIによる動的クエリに置き換える。

✕ 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ビルダーはフィールド名と型の不一致をコンパイル時に検出します。

🗺️

自動マッピング

JPAが結果行をエンティティオブジェクトにマッピングするため、カラムごとの手動抽出は不要です。

🧩

組み合わせ可能な述語

動的WHERE句はand()・or()と再利用可能なPredicateオブジェクトでクリーンに構築できます。

旧来のアプローチ
JDBC ResultSet
モダンなアプローチ
JPA Criteria API
JDKバージョン
11
難易度
上級
JDBC ResultSetマッピングとJPA Criteria APIの比較
利用可能

Jakarta EE 8 / Java 11以降、広く利用可能

生のJDBCではSQL文字列の構築・インデックスによるパラメーター設定・ResultSetの各カラムを手動でマッピングが必要であり、エラーが起きやすくカラム変更時にサイレントに壊れます。JPA Criteria APIは型安全なビルダーパターンでプログラム的にクエリを構築します。カラム名はエンティティモデルと照合して検証され、結果マッピングは自動的に行われ、複雑な動的クエリも文字列連結なしでクリーンに組み立てられます。

共有 𝕏 🦋 in