গ্রুপিং এবং একত্রিতকরণ ফাংশন

আপনি ইতিমধ্যে নির্ণায়ক API এ কিভাবে সহজ অনুরোধ করতে হয় তা খুঁজে পেয়েছেন। আসুন দেখি কিভাবে আরও জটিল প্রশ্ন করা যায়।

উদাহরণস্বরূপ, আমরা একটি কোম্পানিতে কর্মচারীর সংখ্যা নির্ধারণের জন্য একটি প্রশ্ন লিখতে চাই। HQL-এ এটি কেমন দেখাবে তা এখানে:

select count(*) from Employee

এবং মানদণ্ড এপিআইতে এটির মতো:

CriteriaQuery<Long> critQuery = builder.createQuery(Long.class);
critQuery.select(builder.count(critQuery.from(Employee.class)));

সম্পূর্ণ জাভা কোড এই মত দেখাবে:

CriteriaBuilder builder = session.getCriteriaBuilder();

CriteriaQuery<Long> critQuery = builder.createQuery(Long.class);
critQuery.select(builder.count(critQuery.from(Employee.class)));

Query<Long> query = session.createQuery(critQuery);
Long count = query.getSingleResult();

এবং এটি HQL ব্যবহার করে একই:

String hqlQuery = "select count(*) from Employee";

Query<Long> query = session.createQuery(hqlQuery);
Long count = query.getSingleResult();

এখন কোম্পানির গড় বেতন গণনা করার চেষ্টা করা যাক। HQL ক্যোয়ারী এই মত দেখাবে:

select avg(salary) from Employee

এবং মানদণ্ড এপিআইতে এটির মতো:

CriteriaQuery<Double> critQuery = builder.createQuery(Double.class);
critQuery.select(builder.avg( critQuery.from(Employee.class).get("salary")));

সম্পূর্ণ জাভা কোড এই মত দেখাবে:

CriteriaBuilder builder = session.getCriteriaBuilder();

CriteriaQuery<Double> critQuery = builder.createQuery(Double.class);
critQuery.select(builder.avg( critQuery.from(Employee.class).get("salary")));

Query<Double> query = session.createQuery(critQuery);
Double avgSalary = query.getSingleResult();

মানদণ্ড আপডেট

একটি টেবিল পরিবর্তন করা এটি থেকে ডেটা পাওয়ার মতোই সহজ। এটি করার জন্য, CriteriaBuilder এর একটি বিশেষ পদ্ধতি রয়েছে - createCriteriaUpdate() , যা একটি বস্তু তৈরি করেমানদণ্ড আপডেট<T>যে ডাটাবেসের সত্তা আপডেট করে.

১০ হাজারের কম বেতন পাওয়া কর্মচারীদের বেতন বাড়ানো যাক। এই HQL প্রশ্নটি দেখতে কেমন হবে তা এখানে:

update Employee set salary = salary+20000 where salary<=10000

এবং এটি ক্রাইটেরিয়া এপিআইতে এটি দেখতে কেমন হবে:

CriteriaUpdate<Employee> criteriaUpdate = builder.createCriteriaUpdate(Employee.class);
Root<Employee> root = criteriaUpdate.from(Employee.class);
criteriaUpdate.set("salary", "salary+20000");
criteriaUpdate.where(builder.lt(root.get("salary"), 10000));

Transaction transaction = session.beginTransaction();
session.createQuery(criteriaUpdate).executeUpdate();
transaction.commit();

মানদণ্ড মুছুন

এবং রেকর্ড মুছে ফেলা তাদের পরিবর্তন করার চেয়ে আরও সহজ। এটি করার জন্য, একটি বিশেষ পদ্ধতি আছে createCriteriaDelete() , যা একটি বস্তু তৈরি করেমানদণ্ড মুছুন<T>.

যে সকল কর্মচারীদের কোন মূল্য নেই, তাদের বেতন 10 হাজারের কম। এই HQL প্রশ্নটি দেখতে কেমন হবে তা এখানে:

delete from Employee where salary<=10000

এবং এটি ক্রাইটেরিয়া এপিআইতে এটি দেখতে কেমন হবে:

CriteriaDelete<Employee> criteriaDelete = builder.createCriteriaDelete(Employee.class);
Root<Employee> root = criteriaDelete.from(Employee.class);
criteriaDelete.where(builder.lt(root.get("salary"), 10000));

Transaction transaction = session.beginTransaction();
session.createQuery(criteriaDelete).executeUpdate();
transaction.commit();

মানদণ্ড API-এর সুবিধা

তাহলে ক্রাইটেরিয়া API এর সুবিধা কি? প্রশ্নগুলি কষ্টকর, HQL অবশ্যই আরও কমপ্যাক্ট হবে।

প্রথমত, এইচকিউএল কোয়েরিগুলি এত ছোট হয় না যদি আপনাকে তাদের কাছে প্যারামিটার পাস করতে হয়। তুলনা করা:

আমরা 10 হাজারের কম বেতন সহ কর্মচারীর সংখ্যা বিবেচনা করি
HQL
String hqlQuery = "from Employee where salary < :sal";
Query<Employee> query = session.createQuery(hqlQuery);
query.setParametr("sal", 10000);
List<Employee> results = query.getResultList();
মানদণ্ড API
CriteriaBuilder builder = session.getCriteriaBuilder();
critQuery.select(critQuery.from(Employee.class)).where(builder.lt(root.get("salary"), 10000));
Query<Employee> query = session.createQuery(critQuery);
List<Employee> results = query.getResultList();

দ্বিতীয়ত, প্রায়শই এমন একটি পরিস্থিতি থাকে যখন একটি প্রশ্ন গতিশীলভাবে তৈরি করা প্রয়োজন। উদাহরণস্বরূপ, আপনার কাছে একটি ওয়েব পৃষ্ঠা রয়েছে যা কর্মচারী, অ্যাপার্টমেন্ট এবং যেকোনো কিছু ফিল্টার করে। এবং যদি কিছু প্যারামিটার ব্যবহারকারীর কাছে গুরুত্বপূর্ণ না হয় তবে তিনি কেবল এটি নির্দেশ করেন না। তদনুসারে, নাল পরিবর্তে সার্ভারে পাস করা হয়।

এখানে আপনার কাজ: একটি নির্দিষ্ট পেশা (পেশা), বেতন (বেতন) এবং চাকরির বছর (YEAR (join_date)) সহ কর্মচারী নির্বাচন করা। কিন্তু যদি কোনো প্যারামিটার মান শূন্য হয়, তাহলে ফিল্টারে এটি ব্যবহার করবেন না।

তারপর HQL ক্যোয়ারী এই মত কিছু দেখতে হবে:

from Employee
where (occupation = :ocp)
   	and (salary = :sal)
   	and ( YEAR(join_date) = :jny)

কিন্তু এটি সঠিকভাবে কাজ করবে না, যেহেতু আমরা চাই যে যদি "jny" প্যারামিটারটি শূন্য হয়, তাহলে অনুরোধটি এইরকম দেখাবে:

from Employee
where (occupation = :ocp)
   	and (salary = :sal)

আমরা নাল এর জন্য প্যারামিটার চেক করে অনুরোধটি পুনরায় লেখার চেষ্টা করতে পারি, তারপরে আমরা এরকম কিছু পাব:

from Employee
where (occupation = :ocp or :ocp is null)
   	and (salary = :sal or :sal is null)
   	and ( YEAR(join_date)= :jny or :jny is null)

দেখুন কিভাবে বাস্তবতা আরো জটিল হয়? বাস্তবতা প্রায়শই এরকম হয় :)

কিন্তু ফিল্টার আরও জটিল হতে পারে। তাদের মধ্যে "কিনুন" শব্দের সাথে কাজ আছে এমন ব্যবহারকারীদের অনুসন্ধান করার বিষয়ে কীভাবে? অথবা ব্যবহারকারীদের যাদের অতিরিক্ত কাজ আছে?

from Employee
where (occupation = :ocp)
   	and (salary = :sal)
   	and (YEAR(join_date) = :jny)
   	and (tasks.name like '%buy%')
   	and (tasks.deadline < curdate())

আপনি যদি এই ধরনের প্রশ্নে কোথাও লিখেন বা শূন্য হয় , তাহলে এটি টেবিলের মধ্যে যোগদান বাতিল করবে না।

সুতরাং অনুশীলনে, আপনি যখন বেশ কয়েকটি টেবিলের ক্ষেত্রে কোনো জটিল ফিল্টার করেন, তখন মানদণ্ড API আপনাকে সাহায্য করতে পারে। তাই এটা যায়.

আরো বিস্তারিত অফিসিয়াল ডকুমেন্টেশন পাওয়া যাবে .