JDBC ResultSet ম্যাপিং বনাম JPA Criteria API
ডাইনামিক কোয়েরির (dynamic queries) জন্য JPA-এর টাইপ-সেফ Criteria API ব্যবহার করে ম্যানুয়াল JDBC ResultSet ম্যাপিং প্রতিস্থাপন করুন।
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();
}
টাইপ-সেফ কোয়েরি (Type-safe Queries)
Criteria বিল্ডারটি কম্পাইল টাইমে ফিল্ডের নাম এবং টাইপের অমিল (type mismatches) ধরতে পারে।
স্বয়ংক্রিয় ম্যাপিং (Automatic Mapping)
JPA ResultSet থেকে এনটিটি অবজেক্টে (entity objects) ফলাফল ম্যাপিং স্বয়ংক্রিয়ভাবে করে – ম্যানুয়ালি কলাম-বাই-কলাম ডেটা এক্সট্রাক্ট করার প্রয়োজন হয় না।
কম্পোজেবল প্রেডিকেট (Composable Predicates)
ডাইনামিক where-clause গুলো and(), or(), এবং রিইউজেবল Predicate অবজেক্ট ব্যবহার করে পরিষ্কারভাবে তৈরি করা যায়।
জাকার্তা EE 8 / Java 11 থেকে ব্যাপকভাবে উপলব্ধ৷
Raw JDBC ব্যবহার করলে SQL স্ট্রিং তৈরি করা, ইনডেক্স অনুযায়ী প্যারামিটার সেট করা এবং প্রতিটি ResultSet কলামকে ম্যানুয়ালি ম্যাপ করার প্রয়োজন হয়। এটি একটি ভুল-প্রবণ প্রক্রিয়া এবং কলাম পরিবর্তিত হলে কোনো এরর না দেখিয়েই কোড ভেঙে যেতে পারে। JPA Criteria API একটি টাইপ-সেফ বিল্ডার প্যাটার্ন ব্যবহার করে প্রোগ্রামাটিকভাবে কোয়েরি তৈরি করে। এখানে কলামের নামগুলো এনটিটি মডেলের (entity model) সাথে ভ্যালিডেট করা হয়, ফলাফল ম্যাপিং স্বয়ংক্রিয়ভাবে ঘটে এবং জটিল ডাইনামিক কোয়েরিগুলো স্ট্রিং কনক্যাটেনেশন (string concatenation) ছাড়াই পরিষ্কারভাবে তৈরি করা যায়।