NHibernate ORM ব্যবহার করার সময়, ডেটাবেস থেকে ডেটা অনুসন্ধান করার জন্য কয়েকটি কুয়েরি টেকনিক ব্যবহৃত হয়। এর মধ্যে HQL (Hibernate Query Language) একটি গুরুত্বপূর্ণ টেকনিক, যা NHibernate এর নিজস্ব কুয়েরি ভাষা। HQL একটি উচ্চস্তরের (high-level) ভাষা যা SQL-এর মতো দেখতে হলেও, এটি অবজেক্ট-অরিয়েন্টেড পদ্ধতিতে কাজ করে। এই ভাষার মাধ্যমে আপনি সরাসরি ডোমেন অবজেক্টগুলির উপর কুয়েরি চালাতে পারেন।
Querying Techniques
NHibernate এ ডেটা কুয়েরি করার জন্য বেশ কয়েকটি পদ্ধতি রয়েছে। সাধারণত Criteria API, HQL, LINQ ইত্যাদি ব্যবহৃত হয়। এই পদ্ধতিগুলি বিভিন্ন পরিস্থিতিতে ব্যবহার করা যায়।
Criteria API
Criteria API একটি শক্তিশালী কুয়েরি টেকনিক, যা প্রোগ্রামেটিকালি (programmatically) কুয়েরি তৈরি করতে সাহায্য করে। এতে কোডের মাধ্যমে ডেটা ফিল্টারিং, অর্ডারিং, গ্রুপিং ইত্যাদি করা যায়। এটি টাইপ-সেফ, অর্থাৎ, কম্পাইল টাইমে কুয়েরির সঠিকতা চেক করা হয়।
using NHibernate;
using NHibernate.Criterion;
using System.Collections.Generic;
public class EmployeeRepository
{
public IList<Employee> GetEmployeesByAge(int age)
{
using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
{
return session.CreateCriteria<Employee>()
.Add(Restrictions.Gt("Age", age))
.List<Employee>();
}
}
}
এখানে CreateCriteria ব্যবহার করে Employee ক্লাসের উপর কুয়েরি করা হয়েছে এবং Restrictions.Gt ফিল্টার ব্যবহার করে বয়সের উপর শর্ত দেওয়া হয়েছে।
HQL (Hibernate Query Language)
HQL হল NHibernate এর জন্য SQL-এর মতো একটি কুয়েরি ভাষা, তবে এটি SQL এর পরিবর্তে অবজেক্ট-অরিয়েন্টেড ডোমেন ক্লাসের উপর কাজ করে। HQL লেখার সময় SQL-এর মতোই সিনট্যাক্স ব্যবহার করা হয়, তবে এখানে টেবিলের পরিবর্তে ক্লাস এবং কলামের পরিবর্তে প্রপার্টি উল্লেখ করা হয়।
HQL কুয়েরি উদাহরণ
1. Select কুয়েরি
using NHibernate;
using System;
using System.Linq;
public class EmployeeRepository
{
public void GetEmployees()
{
using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
{
var query = session.CreateQuery("FROM Employee e");
var employees = query.List<Employee>();
foreach (var employee in employees)
{
Console.WriteLine($"Name: {employee.Name}, Age: {employee.Age}");
}
}
}
}
এখানে FROM Employee e HQL কুয়েরি ব্যবহার করা হয়েছে যা Employee ক্লাসের সব রেকর্ড ফেরত দিবে।
2. Where কুয়েরি
public void GetEmployeesByAge(int age)
{
using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
{
var query = session.CreateQuery("FROM Employee e WHERE e.Age > :age");
query.SetParameter("age", age);
var employees = query.List<Employee>();
foreach (var employee in employees)
{
Console.WriteLine($"Name: {employee.Name}, Age: {employee.Age}");
}
}
}
এখানে SetParameter ব্যবহার করে ডাইনামিকভাবে কুয়েরিতে প্যারামিটার পাস করা হয়েছে। এটি HQL-এ WHERE শর্ত যোগ করার একটি সাধারণ পদ্ধতি।
3. Order By কুয়েরি
public void GetEmployeesOrderedByName()
{
using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
{
var query = session.CreateQuery("FROM Employee e ORDER BY e.Name ASC");
var employees = query.List<Employee>();
foreach (var employee in employees)
{
Console.WriteLine($"Name: {employee.Name}, Age: {employee.Age}");
}
}
}
এখানে ORDER BY ব্যবহার করে কর্মচারীদের নামের উপর সোর্ট করা হয়েছে।
4. Aggregate Functions (SUM, AVG, COUNT)
public void GetEmployeeCount()
{
using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
{
var query = session.CreateQuery("SELECT COUNT(*) FROM Employee e");
var employeeCount = query.UniqueResult<int>();
Console.WriteLine($"Total Employees: {employeeCount}");
}
}
এখানে COUNT(*) ব্যবহার করে কর্মচারীর মোট সংখ্যা গণনা করা হয়েছে।
HQL এবং SQL এর পার্থক্য
HQL এবং SQL-এর মধ্যে কিছু মৌলিক পার্থক্য রয়েছে, যা বুঝে নিলে হাইপারফরম্যান্স কুয়েরি লিখতে সুবিধা হবে:
- SQL টেবিলের উপর কাজ করে, তবে HQL অবজেক্ট ক্লাসের উপর কাজ করে।
- SQL তে কেবল কলাম নাম ব্যবহার করা হয়, কিন্তু HQL তে ক্লাসের প্রপার্টি এবং ফিল্ড নাম ব্যবহার করা হয়।
- HQL ডেটাবেস নিরপেক্ষ এবং SQL ডেটাবেসের প্রতি নির্দিষ্ট।
HQL এর আরও কিছু ফিচার
Joins: HQL তে আপনি সহজেই একাধিক টেবিলের মধ্যে যোগসূত্র করতে পারেন।
var query = session.CreateQuery("FROM Employee e JOIN e.Department d WHERE d.Name = :deptName"); query.SetParameter("deptName", "IT"); var employees = query.List<Employee>();Subqueries: HQL তে সাবকুয়েরি ব্যবহার করা সম্ভব।
var query = session.CreateQuery("FROM Employee e WHERE e.Age > (SELECT AVG(e.Age) FROM Employee e)"); var employees = query.List<Employee>();
সারাংশ
NHibernate এর HQL (Hibernate Query Language) খুবই শক্তিশালী এবং SQL-এর সাথে সাদৃশ্যপূর্ণ একটি কুয়েরি ভাষা। HQL ব্যবহার করে অবজেক্ট-অরিয়েন্টেড ডেটা মডেল থেকে ডেটা সহজে কুয়েরি করা সম্ভব। Criteria API এবং LINQ আরও কিছু শক্তিশালী কুয়েরি টেকনিক হিসেবে ব্যবহৃত হয়, তবে HQL আপনাকে ডেটাবেসের সাথে কাজ করার জন্য উচ্চস্তরের এবং আরো নমনীয় উপায় প্রদান করে।
HQL (Hibernate Query Language) হল একটি অবজেক্ট-ওরিয়েন্টেড কুয়েরি ভাষা যা NHibernate ব্যবহার করে ডেটাবেসে ডেটা খোঁজার জন্য ব্যবহৃত হয়। এটি SQL এর মতো, তবে SQL এর পরিবর্তে এটি অবজেক্ট-ভিত্তিক ভাষা, যেখানে আপনি অবজেক্টের ক্ষেত্র এবং তাদের সম্পর্কের মাধ্যমে কুয়েরি তৈরি করেন, টেবিল এবং কলামের পরিবর্তে।
HQL এর মাধ্যমে আপনি অবজেক্টগুলির উপর কুয়েরি করতে পারেন, যা আপনাকে ডেটাবেসের টেবিল স্ট্রাকচারের সাথে সরাসরি কাজ করার পরিবর্তে ক্লাস এবং অবজেক্টের সাথে কাজ করার সুযোগ দেয়।
HQL এর বৈশিষ্ট্য
- অবজেক্ট-ওরিয়েন্টেড কুয়েরি: HQL তে আপনি সরাসরি ডেটাবেস টেবিলের পরিবর্তে ক্লাস এবং অবজেক্টের উপর কুয়েরি করবেন।
- SQL-এর মতো সেন্ট্যাক্স: HQL সেন্ট্যাক্স SQL এর মতো হলেও, এটি ডেটাবেস টেবিলের পরিবর্তে অবজেক্ট এবং তাদের প্রপার্টি ব্যবহার করে।
- এন্টিটি এবং সম্পর্ক: HQL তে আপনি অবজেক্টগুলির মধ্যে সম্পর্কগুলি যেমন One-to-Many, Many-to-One, Many-to-Many ইত্যাদি হ্যান্ডেল করতে পারেন।
- টেবিলের নামের পরিবর্তে ক্লাসের নাম: HQL কুয়েরিতে আপনি সরাসরি টেবিলের নাম ব্যবহার না করে ক্লাসের নাম ব্যবহার করবেন।
HQL কুয়েরি লেখার নিয়ম
HQL কুয়েরি সাধারণত from এবং select শব্দের মাধ্যমে শুরু হয়, যেখানে from ক্লাসের নাম নির্দেশ করে এবং select কী প্রপার্টি বা তথ্য প্রয়োজন তা নির্দেশ করে।
উদাহরণ:
from Customer c where c.Name = 'John Doe'
এখানে, Customer ক্লাসের অবজেক্ট c এর মধ্যে Name প্রপার্টি 'John Doe' এর সমান এমন রেকর্ডগুলি খোঁজা হচ্ছে।
HQL এর মৌলিক কুয়েরি অপারেশন
1. Select কুয়েরি
from Customer c where c.Name = 'John Doe'
এটি Customer অবজেক্টের জন্য কুয়েরি করবে এবং Name প্রপার্টির মান 'John Doe' এর সমান এমন Customer অবজেক্টগুলো ফিরিয়ে দেবে।
2. Order By
from Customer c order by c.Name asc
এখানে, Customer রেকর্ডগুলো Name প্রপার্টি অনুযায়ী ascending অর্ডারে সাজানো হবে।
3. Join
HQL এ join ব্যবহার করে সম্পর্কিত অবজেক্টগুলির ডেটা একসাথে লোড করা যায়। উদাহরণস্বরূপ, Customer এবং Order এর মধ্যে সম্পর্কিত ডেটা একত্রে লোড করতে:
from Customer c join fetch c.Orders where c.Name = 'John Doe'
এখানে, Customer এবং তার সাথে সম্পর্কিত Orders একসাথে লোড হবে।
4. Group By
select c.Country, count(c) from Customer c group by c.Country
এটি Customer অবজেক্টের Country প্রপার্টি অনুযায়ী গ্রুপিং করবে এবং প্রতিটি দেশে কতজন গ্রাহক আছে তা গননা করবে।
HQL তে Aggregate Functions
HQL তে কিছু সাধারণ Aggregate Functions ব্যবহার করা যায়, যেমন count(), sum(), avg(), min(), max() ইত্যাদি। এই ফাংশনগুলো ডেটার ওপর বিভিন্ন গণনা বা পরিসংখ্যান তৈরি করতে ব্যবহৃত হয়।
উদাহরণ:
select count(c) from Customer c where c.Country = 'USA'
এখানে, USA দেশে থাকা Customer গুলোর মোট সংখ্যা গননা করা হবে।
HQL তে ইনপুট এবং আউটপুট
HQL কুয়েরিতে parameter binding ব্যবহার করা হয়, যাতে ডাইনামিক ভ্যালু পাস করা যায়। উদাহরণস্বরূপ:
from Customer c where c.Name = :customerName
এখানে, :customerName হল একটি প্লেসহোল্ডার, যেখানে পরবর্তীতে আপনি ডাইনামিকভাবে একটি মান পাস করতে পারবেন:
var query = session.CreateQuery("from Customer c where c.Name = :customerName");
query.SetParameter("customerName", "John Doe");
var customer = query.List<Customer>();
HQL এবং Criteria API এর মধ্যে পার্থক্য
HQL এবং Criteria API উভয়েই NHibernate তে কুয়েরি তৈরি করার জন্য ব্যবহৃত হয়, তবে তাদের ব্যবহারের মধ্যে কিছু পার্থক্য রয়েছে।
- HQL হল একটি কুয়েরি ভাষা, যেখানে আপনি কুয়েরি স্ট্রিং লিখে কাজ করবেন।
- Criteria API হল একটি প্রোগ্রাম্যাটিক পদ্ধতি, যেখানে আপনি কোডের মাধ্যমে কুয়েরি তৈরি করেন এবং জটিল কুয়েরি গঠন করতে পারেন।
HQL এর মাধ্যমে ডেটা লোড করা
using (var session = NHibernateHelper.SessionFactory.OpenSession())
{
var query = session.CreateQuery("from Customer c where c.Name = :name");
query.SetParameter("name", "John Doe");
var customer = query.List<Customer>(); // List of Customers returned
}
এখানে HQL ব্যবহার করে Customer নামক ক্লাস থেকে Name প্রপার্টি 'John Doe' এর সমান এমন রেকর্ডগুলো লোড করা হচ্ছে।
Criteria API এবং Query Over হল NHibernate এ ডেটাবেস কুয়েরি করার দুটি শক্তিশালী উপায়। এগুলি আপনাকে SQL কোড লেখার প্রয়োজন ছাড়াই ডেটাবেসের সাথে ইন্টারঅ্যাক্ট করার সুবিধা দেয় এবং কোডে টাইপ সেফটি বজায় রাখে। এই দুটি পদ্ধতি ব্যবহার করে আপনি ডেটাবেসে প্রয়োজনীয় ডেটা খুঁজে পেতে পারবেন, তবে প্রতিটির ব্যবহার ভিন্ন।
1. Criteria API
Criteria API হল NHibernate এর একটি ক্লাসিক পদ্ধতি যা আপনাকে প্যারামিটারাইজড কুয়েরি তৈরি করতে সাহায্য করে। এটি একটি প্রোগ্রামেটিক উপায়, যেখানে আপনি অবজেক্টের প্রপার্টি ও শর্তাবলীর মাধ্যমে কুয়েরি তৈরি করতে পারেন, এবং এটি SQL ইনজেকশন থেকে নিরাপদ।
Criteria API উদাহরণ
ধরা যাক, আপনার কাছে Employee নামক একটি ক্লাস রয়েছে এবং আপনি সকল Employee এর নাম এবং বয়স অনুযায়ী কুয়েরি করতে চান।
using (var session = sessionFactory.OpenSession())
{
var criteria = session.CreateCriteria<Employee>()
.Add(Restrictions.Eq("Department", "HR"))
.Add(Restrictions.Gt("Age", 30));
var employees = criteria.List<Employee>();
}
এখানে, CreateCriteria<Employee>() এর মাধ্যমে Employee ক্লাসের জন্য একটি Criteria অবজেক্ট তৈরি করা হয়েছে। তারপর Add() মেথড দিয়ে শর্ত যোগ করা হয়েছে। Restrictions.Eq() এবং Restrictions.Gt() শর্তগুলো Department এবং Age প্রপার্টির উপর ভিত্তি করে ডেটা ফিল্টার করেছে।
2. Query Over
Query Over হল NHibernate এর একটি শক্তিশালী এবং টাইপ সেফ উপায়, যা Criteria API এর আধুনিক সংস্করণ হিসেবে বিবেচিত। এটি LINQ এর মত কাজ করে এবং কোড লেখার সময় টাইপ সেফটি নিশ্চিত করে। Query Over ব্যবহার করে আপনি সহজে কুয়েরি করতে পারেন এবং কোডকে আরও ক্লিন এবং রিডেবল রাখতে পারেন।
Query Over উদাহরণ
ধরা যাক, আপনি Employee ক্লাসের ডেটা Department এবং Age এর ভিত্তিতে ফিল্টার করতে চান।
using (var session = sessionFactory.OpenSession())
{
var queryOver = session.QueryOver<Employee>()
.Where(x => x.Department == "HR")
.And(x => x.Age > 30);
var employees = queryOver.List<Employee>();
}
এখানে, QueryOver() ব্যবহার করে আপনি Employee ক্লাসের উপর কুয়েরি তৈরি করেছেন এবং Where() এবং And() মেথডের মাধ্যমে শর্ত যোগ করেছেন। এই পদ্ধতিটি অত্যন্ত টাইপ সেফ এবং কোড লেখা আরও সহজ এবং পরিষ্কার হয়।
3. Criteria API বনাম Query Over
Criteria API এবং Query Over উভয়ই শক্তিশালী কুয়েরি টুল, তবে কিছু মৌলিক পার্থক্য রয়েছে:
- Criteria API সাধারণত আরও বেশি ফ্লেক্সিবল, তবে টাইপ সেফটি কম থাকে। এটি অনেক সময় SQL কোডের মত কাজ করে এবং কম্পাইল টাইমে ত্রুটি চেক করে না।
- Query Over টাইপ সেফ, LINQ-এর মত কাজ করে এবং কোডে আরও পরিষ্কার এবং কার্যকরী উপায় ব্যবহার করতে সহায়তা করে।
যদি আপনি টাইপ সেফ কুয়েরি চান এবং কোড আরও সহজ রাখতে চান, তবে Query Over ব্যবহার করা উত্তম। তবে যদি আপনি আরও কাস্টম কুয়েরি তৈরি করতে চান এবং অনেক শর্ত একত্রে সংযুক্ত করতে চান, তবে Criteria API উপযুক্ত হতে পারে।
এই দুটি পদ্ধতির মাধ্যমে আপনি NHibernate ব্যবহার করে ডেটাবেসের কুয়েরি আরও কার্যকরভাবে পরিচালনা করতে পারবেন।
Named Query এবং Parameterized Query হল NHibernate এ ডেটাবেস থেকে ডেটা রিট্রাইভ করতে ব্যবহৃত দুটি জনপ্রিয় কৌশল। এগুলি HQL (Hibernate Query Language) বা Criteria API এর মাধ্যমে ডেটা ফেচিং অপারেশনকে আরও সহজ এবং কার্যকর করে তোলে।
Named Query
Named Query হল একটি পূর্বনির্ধারিত কোয়েরি যেটি একটি নির্দিষ্ট নাম দিয়ে তৈরি করা হয় এবং পরে সেই নাম ব্যবহার করে কোয়েরি এক্সিকিউট করা হয়। এতে কোডের পুনঃব্যবহারযোগ্যতা এবং রিডেবিলিটি বৃদ্ধি পায়, কারণ কোয়েরি কোডের মধ্যে বারবার লিখতে হয় না, শুধু একবার নাম দিয়ে সেটি সংজ্ঞায়িত করে পরে ডেটা অ্যাক্সেস করা যায়।
Named Query কনফিগারেশন
Named Query সাধারণত hibernate.cfg.xml বা mapping ফাইলে সংজ্ঞায়িত করা হয়। একটি Named Query কনফিগারেশন ফাইলের মাধ্যমে ব্যবহার করা হয় যেমন:
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<mapping class="YourNamespace.Customer"/>
<query name="findCustomersByCity">
<![CDATA[
from Customer c where c.City = :city
]]>
</query>
</session-factory>
</hibernate-configuration>
এখানে, findCustomersByCity নামক Named Query তৈরি করা হয়েছে যা Customer নামক টেবিল থেকে City ফিল্ডের ভিত্তিতে ডেটা ফেচ করবে।
Named Query ব্যবহার
কোডে Named Query ব্যবহার করার উদাহরণ:
using (var session = NHibernateHelper.SessionFactory.OpenSession())
{
var query = session.GetNamedQuery("findCustomersByCity")
.SetParameter("city", "Dhaka");
var customers = query.List<Customer>(); // Customers from Dhaka
}
এখানে session.GetNamedQuery("findCustomersByCity") এর মাধ্যমে findCustomersByCity নামক কোয়েরি এক্সিকিউট করা হচ্ছে এবং .SetParameter("city", "Dhaka") এর মাধ্যমে city প্যারামিটার প্রদান করা হচ্ছে।
Parameterized Query
Parameterized Query হল এমন একটি কোয়েরি যেখানে প্যারামিটার ব্যবহার করে কুয়েরি ডাইনামিকভাবে তৈরি করা হয়। এটি নিরাপদ এবং কার্যকর কৌশল, কারণ এর মাধ্যমে SQL ইনজেকশন এড়ানো যায় এবং কোডের রিডেবিলিটি বাড়ানো যায়। প্যারামিটারাইজড কোয়েরি লিখে ডেটাবেস থেকে ডেটা ফেচ করা হয়।
Parameterized Query কনফিগারেশন
Parameterized Query এর মাধ্যমে SQL বা HQL কোয়েরিতে প্যারামিটার যোগ করা হয়। উদাহরণস্বরূপ:
using (var session = NHibernateHelper.SessionFactory.OpenSession())
{
var query = session.CreateQuery("from Customer c where c.City = :city")
.SetParameter("city", "Dhaka");
var customers = query.List<Customer>(); // Customers from Dhaka
}
এখানে, :city হল প্যারামিটার, এবং .SetParameter("city", "Dhaka") এর মাধ্যমে প্যারামিটারটি Dhaka এর মান দেওয়া হয়েছে।
Parameterized Query এর সুবিধা
- SQL Injection থেকে সুরক্ষা: প্যারামিটারাইজড কোয়েরি SQL ইনজেকশন প্রতিরোধে সহায়তা করে, কারণ প্যারামিটারগুলো কোয়েরির অংশ হিসেবে সুরক্ষিতভাবে ইনপুট হয়।
- ডাইনামিক কোয়েরি তৈরি: প্যারামিটার ব্যবহার করে কোয়েরি তৈরি করা যেতে পারে, যা বিভিন্ন মানের জন্য পুনরায় ব্যবহারযোগ্য।
Named Query এবং Parameterized Query এর মধ্যে পার্থক্য
- Named Query একটি পূর্বনির্ধারিত কোয়েরি যা একবার সংজ্ঞায়িত করার পরে বারবার ব্যবহার করা যায়, যেখানে Parameterized Query একটি ডাইনামিক কোয়েরি যেটি runtime এ প্যারামিটার গ্রহণ করে।
- Named Query সাধারণত কোডের বাইরে hibernate.cfg.xml বা mapping ফাইলে সংজ্ঞায়িত হয়, কিন্তু Parameterized Query কোডে সরাসরি HQL বা Criteria API ব্যবহার করে তৈরি করা হয়।
এভাবে, Named Query এবং Parameterized Query উভয়ই NHibernate এ ডেটাবেস অ্যাক্সেসের জন্য ব্যবহার করা যায়, তবে নির্দিষ্ট প্রয়োজন এবং প্রয়োজনে একেকটি উপকারী হতে পারে।
NHibernate তে Native SQL এবং Stored Procedure ব্যবহার করার মাধ্যমে আপনি ডেটাবেসের সাথে আরও উন্নত এবং কাস্টম কোয়েরি অপারেশন করতে পারেন। NHibernate ডিফল্টভাবে HQL (Hibernate Query Language) এবং LINQ সমর্থন করে, তবে কিছু ক্ষেত্রে আপনাকে ডেটাবেসের সাথে সরাসরি যোগাযোগের জন্য Native SQL অথবা Stored Procedure ব্যবহার করতে হতে পারে।
এখানে Native SQL এবং Stored Procedure কিভাবে কনফিগার এবং ব্যবহার করতে হয় তা আলোচনা করা হবে।
Native SQL ব্যবহার করা
Native SQL হল সরাসরি ডেটাবেসে লেখা SQL কোয়েরি যা NHibernate এর নিজস্ব হাইব্রিড কুয়েরি ল্যাঙ্গুয়েজের বাইরে কাজ করে। এটি যখন ব্যবহার করা হয়, তখন NHibernate ডেটাবেসের সঠিক SQL কোড ব্যবহার করবে।
Native SQL এর মাধ্যমে Query Execution
using (var session = NHibernateHelper.SessionFactory.OpenSession())
{
var query = session.CreateSQLQuery("SELECT * FROM Employee WHERE Age > :age")
.SetParameter("age", 25);
var employees = query.List<Employee>();
foreach (var employee in employees)
{
Console.WriteLine($"Employee Name: {employee.Name}, Age: {employee.Age}");
}
}
এখানে:
- CreateSQLQuery() মেথড ব্যবহার করা হয়েছে, যেখানে আপনি সরাসরি SQL কোড দিতে পারেন।
- SetParameter() মেথডের মাধ্যমে SQL কোয়েরিতে প্যারামিটার পাস করা হয়েছে (এখানে
:ageপ্যারামিটারটি 25 দিয়ে সেট করা হয়েছে)।
Native SQL এর মাধ্যমে Result Mapping
যদি আপনার কোয়েরি শুধুমাত্র কিছু কাস্টম ডেটা রিটার্ন করে এবং সেই ডেটা আপনার Entity Class এর সাথে ম্যাচ না করে, তাহলে আপনি Tuple অথবা Object[] ব্যবহার করে ডেটা রিটার্ন করতে পারেন।
using (var session = NHibernateHelper.SessionFactory.OpenSession())
{
var query = session.CreateSQLQuery("SELECT Name, Age FROM Employee WHERE Position = :position")
.SetParameter("position", "Software Developer");
var result = query.List<object[]>(); // Result will be in the form of Object array
foreach (var row in result)
{
var name = row[0];
var age = row[1];
Console.WriteLine($"Name: {name}, Age: {age}");
}
}
এখানে:
- কোয়েরি থেকে Object[] আউটপুট পাওয়া যাবে, যেখানে প্রথম কলাম হবে
Nameএবং দ্বিতীয় কলাম হবেAge।
Stored Procedure ব্যবহার করা
Stored Procedure একটি ডেটাবেস অবজেক্ট যা একটি বা একাধিক SQL অপারেশনকে একত্রিত করে। NHibernate তে Stored Procedure কল করতে আপনি CreateSQLQuery() মেথডের মাধ্যমে এটি করতে পারেন।
Stored Procedure কল করা
using (var session = NHibernateHelper.SessionFactory.OpenSession())
{
var query = session.CreateSQLQuery("EXEC GetEmployeesByPosition :position")
.SetParameter("position", "Software Developer");
var employees = query.List<Employee>(); // Map the result to Employee entities
foreach (var employee in employees)
{
Console.WriteLine($"Employee Name: {employee.Name}, Age: {employee.Age}");
}
}
এখানে:
- EXEC GetEmployeesByPosition হল একটি Stored Procedure যা
positionপ্যারামিটার নিয়ে কাজ করবে। - SetParameter() মেথড দিয়ে Stored Procedure এর প্যারামিটার পাস করা হচ্ছে।
- List() ব্যবহার করে ফলাফলকে
Employeeএনটিটির মধ্যে ম্যাপ করা হচ্ছে।
Stored Procedure Result Mapping
এখন যদি আপনি একটি Stored Procedure এর মাধ্যমে এমন ডেটা পেতে চান যা Entity Class এর সাথে পুরোপুরি মিলে না, তাহলে আপনি DTO (Data Transfer Object) বা অন্য কোনো Custom Object তৈরি করতে পারেন এবং সেই Object তে মাপসই ডেটা রাখতে পারেন।
public class EmployeeDTO
{
public string Name { get; set; }
public int Age { get; set; }
}
using (var session = NHibernateHelper.SessionFactory.OpenSession())
{
var query = session.CreateSQLQuery("EXEC GetEmployeeDetails")
.AddScalar("Name", NHibernateUtil.String)
.AddScalar("Age", NHibernateUtil.Int32);
var result = query.List<object[]>(); // Use Object[] to get the result
var employees = result.Select(row => new EmployeeDTO
{
Name = (string)row[0],
Age = (int)row[1]
}).ToList();
foreach (var employee in employees)
{
Console.WriteLine($"Name: {employee.Name}, Age: {employee.Age}");
}
}
এখানে:
- AddScalar() ব্যবহার করে SQL কোয়েরির আউটপুট কলামগুলোকে DTO তে ম্যাপ করা হচ্ছে।
- List<object[]> থেকে DTO তৈরি করা হচ্ছে এবং সেগুলোকে প্রিন্ট করা হচ্ছে।
Native SQL এবং Stored Procedure এর সাথে Transactions
যখন আপনি Native SQL অথবা Stored Procedure কল করছেন, তখন transactions ব্যবহারের গুরুত্ব আরও বেড়ে যায়। আপনাকে নিশ্চিত করতে হবে যে, যদি কোয়েরি বা Stored Procedure এ কোনো সমস্যা ঘটে, তাহলে ট্রানজেকশন রোলব্যাক করা হবে।
using (var session = NHibernateHelper.SessionFactory.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
try
{
var query = session.CreateSQLQuery("EXEC SomeProcedure");
query.ExecuteUpdate(); // Execute Stored Procedure
transaction.Commit(); // Commit the transaction
}
catch (Exception)
{
transaction.Rollback(); // Rollback if something goes wrong
throw;
}
}
}
এখানে:
- যদি কোন ভুল হয়, তাহলে transaction.Rollback() ব্যবহার করে পরিবর্তন গুলি রিভার্ট করা হবে।
- যদি সমস্ত কিছু ঠিক থাকে, তাহলে transaction.Commit() ব্যবহার করে পরিবর্তন সেভ করা হবে।
উপসংহার
Native SQL এবং Stored Procedure ব্যবহার করে আপনি NHibernate এর মাধ্যমে ডেটাবেসের সাথে সরাসরি এবং বেশি কাস্টমাইজড কাজ করতে পারবেন। এটি বিশেষভাবে গুরুত্বপূর্ণ যখন আপনাকে complex SQL কোয়েরি অথবা ডেটাবেসের বিভিন্ন নির্দিষ্ট অপারেশন সম্পাদন করতে হয়।
Read more