NHibernate-এ Criteria API এবং Projections ব্যবহার করে আপনি অত্যন্ত জটিল কুয়েরি গঠন করতে পারেন যা SQL এর জটিলতা ছাড়াই ডেটাবেস থেকে প্রয়োজনীয় তথ্য অনুসন্ধান করতে সাহায্য করে। Criteria API একটি উচ্চমানের কুয়েরি ল্যাঙ্গুয়েজ প্রদান করে যা SQL-লাইক প্রশ্নের জন্য প্রোগ্রাম্যাটিক পদ্ধতি ব্যবহার করতে সক্ষম হয়, এবং Projections ব্যবহার করে আপনি ডেটা সিলেক্ট করতে পারেন, গ্রুপ করতে পারেন এবং কাস্টম আউটপুট তৈরি করতে পারেন।
Criteria API এর ধারণা
Criteria API একটি Object-Oriented পদ্ধতি যা SQL কুয়েরি লেখার পরিবর্তে কোড-ভিত্তিক উপায়ে ডেটাবেস কুয়েরি তৈরি করতে দেয়। এতে আপনি ডেটাবেসে কীভাবে ডেটা অনুসন্ধান করা হবে তা খুবই সহজভাবে ডিফাইন করতে পারেন, যেমন প্রোপার্টি, ক্লাস, এবং তাদের মধ্যে সম্পর্ক ব্যবহার করে।
এটি Hibernate ও NHibernate উভয়েই সমর্থিত, এবং Criteria কুয়েরি ব্যবহার করে আপনি বিভিন্ন ধরণের জটিল কুয়েরি তৈরি করতে পারেন।
Projections ব্যবহার করা
Projections মূলত NHibernate-এর Criteria API এর একটি শক্তিশালী বৈশিষ্ট্য যা আপনাকে নির্বাচনকৃত কলাম বা এগ্রিগেট ফাংশন (যেমন COUNT, AVG, SUM ইত্যাদি) থেকে ডেটা সংগ্রহ করতে সহায়তা করে। এটি যখন একটি Projection তৈরি হয় তখন SQL কুয়েরি সংক্ষেপিত হয়ে যায় এবং আপনি খুব সহজে চাহিদা অনুযায়ী আউটপুট পাবেন।
Complex Query উদাহরণ
ধরা যাক আমাদের কাছে Employee এবং Department নামের দুটি ক্লাস রয়েছে। Employee ক্লাসের মধ্যে Department সম্পর্ক রয়েছে। এবং আমরা একটি জটিল কুয়েরি তৈরি করতে চাই, যেখানে আমাদের Employee এর নাম, তার বেতন এবং সংশ্লিষ্ট Department এর নাম প্রয়োজন।
Step 1: Employee এবং Department ক্লাস
public class Employee
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual decimal Salary { get; set; }
public virtual Department Department { get; set; }
}
public class Department
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
}
এখানে Employee এবং Department ক্লাসের মধ্যে একে অপরের সাথে সম্পর্ক রয়েছে, যেখানে Employee এর Department প্রপার্টি ব্যবহার করে সংশ্লিষ্ট বিভাগের তথ্য পাওয়া যাবে।
Step 2: Criteria API ব্যবহার করে Complex Query তৈরি করা
এখন, আমরা Criteria API ব্যবহার করে একটি কুয়েরি তৈরি করব যা Employee এর নাম, বেতন এবং সংশ্লিষ্ট Department এর নাম একত্রিত করে।
using NHibernate;
using NHibernate.Criterion;
public class EmployeeService
{
public IList<Employee> GetEmployeesWithDepartmentName(decimal salaryThreshold)
{
using (var session = sessionFactory.OpenSession())
{
var criteria = session.CreateCriteria<Employee>()
.CreateAlias("Department", "d") // Department টেবিলের সাথে যোগদান
.Add(Restrictions.Gt("Salary", salaryThreshold)) // Salary এর সীমা নির্ধারণ
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("Name"), "EmployeeName") // Employee এর নাম নির্বাচন
.Add(Projections.Property("Salary"), "EmployeeSalary") // Employee এর Salary নির্বাচন
.Add(Projections.Property("d.Name"), "DepartmentName") // Department এর নাম নির্বাচন
)
.List<object[]>(); // এখানে result হিসাবে object array পাওয়া যাবে
// ফলাফল হিসেবে `object[]` এর মাধ্যমে নাম, বেতন এবং বিভাগের নাম ফেরত হবে
return criteria.List<object[]>().Select(x => new Employee
{
Name = (string)x[0],
Salary = (decimal)x[1],
Department = new Department { Name = (string)x[2] }
}).ToList();
}
}
}
এখানে:
- CreateAlias মেথড ব্যবহার করে
EmployeeএবংDepartmentটেবিলের মধ্যে যোগদান (JOIN) তৈরি করা হয়েছে। - Restrictions.Gt দ্বারা
Salaryএর জন্য একটি শর্ত যুক্ত করা হয়েছে, যাতে নির্দিষ্ট পরিমাণ বেতনের বেশি চাকরিজীবীদের তথ্য ফেরত আসে। - SetProjection ব্যবহার করে শুধুমাত্র নির্দিষ্ট প্রোপার্টি (যেমন নাম, বেতন, বিভাগ) নির্বাচন করা হয়েছে।
- Projections.Property ব্যবহার করে
EmployeeএবংDepartmentউভয়ের প্রোপার্টি নির্বাচিত করা হয়েছে। - কুয়েরির ফলাফল object[] আকারে আসে, যেখানে প্রতিটি উপাদান হলো একটি
Employeeএর তথ্য এবং তার সম্পর্কিতDepartmentএর নাম।
Step 3: Aggregate Functions ব্যবহার করা
Criteria API ব্যবহার করে আপনি এগ্রিগেট ফাংশন (যেমন COUNT, SUM, AVG) ব্যবহার করতে পারেন। নিচে SUM ফাংশন ব্যবহার করে একটি কুয়েরি তৈরি করা হয়েছে, যেখানে সমস্ত Employee এর বেতন যোগফল বের করা হবে।
using NHibernate;
using NHibernate.Criterion;
public class EmployeeService
{
public decimal GetTotalSalary()
{
using (var session = sessionFactory.OpenSession())
{
var criteria = session.CreateCriteria<Employee>()
.SetProjection(Projections.Sum("Salary")); // SUM ফাংশন ব্যবহার করে Salary এর মোট যোগফল বের করা
return criteria.UniqueResult<decimal>(); // একক ফলাফল ফেরত হবে
}
}
}
এখানে:
- Projections.Sum ব্যবহার করে সমস্ত
Employeeএর বেতন (Salary) এর যোগফল হিসাব করা হয়েছে। - UniqueResult ব্যবহার করে একক রেজাল্ট ফেরত পাওয়া যাবে।
Step 4: Grouping এবং Filtering
Criteria API ব্যবহার করে আপনি GROUP BY এবং HAVING ক্লজও প্রয়োগ করতে পারেন। নিচে Group By এবং Having শর্তসহ একটি কুয়েরি উদাহরণ দেয়া হলো:
using NHibernate;
using NHibernate.Criterion;
public class EmployeeService
{
public IList<object[]> GetDepartmentWiseSalarySummary()
{
using (var session = sessionFactory.OpenSession())
{
var criteria = session.CreateCriteria<Employee>()
.CreateAlias("Department", "d") // Department টেবিলের সাথে যোগদান
.SetProjection(Projections.ProjectionList()
.Add(Projections.GroupProperty("d.Name"), "DepartmentName") // Department এর নাম গ্রুপ করা
.Add(Projections.Sum("Salary"), "TotalSalary") // Salary এর যোগফল
)
.Add(Restrictions.Gt("Salary", 30000)) // Salary এর শর্ত
.List<object[]>(); // ফলাফল হিসেবে object array ফেরত
return criteria.List<object[]>();
}
}
}
এখানে:
- Projections.GroupProperty ব্যবহার করে বিভাগ অনুযায়ী গ্রুপিং করা হয়েছে।
- Projections.Sum দ্বারা প্রতিটি বিভাগের জন্য মোট বেতন যোগফল বের করা হয়েছে।
উপসংহার
NHibernate এর Criteria API এবং Projections ব্যবহার করে আপনি খুব সহজে জটিল কুয়েরি তৈরি করতে পারেন, যেমন একাধিক টেবিলের মধ্যে সম্পর্ক তৈরি করা, ডেটা গ্রুপিং, এবং এগ্রিগেট ফাংশন ব্যবহার করা। এই পদ্ধতিগুলি SQL কুয়েরি লেখার চেয়ে অনেক বেশি শক্তিশালী এবং ফ্লেক্সিবল, কারণ এটি একটি প্রোগ্রাম্যাটিক পদ্ধতিতে কাজ করে, যা কোডের মাধ্যমে আপনার কাঙ্ক্ষিত ফলাফল অর্জন করতে সক্ষম।
Read more