Enterprise متقدم

استبدل تعيين 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