Hibernate Query Language (HQL)

Java Technologies - হাইবারনেট (Hibernate)
159
159

Hibernate Query Language (HQL) হল Hibernate-এর নিজস্ব অনুসন্ধান ভাষা, যা SQL (Structured Query Language) এর মতো কাজ করে তবে এটি object-oriented। HQL আপনাকে ডেটাবেস টেবিলের উপর কাজ করার জন্য SQL কোড লেখার পরিবর্তে Java Objects এবং তাদের properties ব্যবহার করতে সক্ষম করে।

HQL-এর মাধ্যমে আপনি Java objects এর উপর অনুসন্ধান চালাতে পারেন, যেমন SELECT, UPDATE, DELETE, এবং INSERT স্টেটমেন্টগুলি। HQL SQL এর মতোই ব্যবহার করা যায়, তবে এটি SQL এর পরিবর্তে Hibernate-এর অবজেক্ট মডেল (Java classes) ব্যবহার করে।


HQL এর মূল বৈশিষ্ট্যসমূহ:

  1. Object-Oriented:
    • HQL সম্পূর্ণভাবে অবজেক্ট-ওরিয়েন্টেড। SQL-এ যেখানে টেবিল এবং কলাম ব্যবহার হয়, সেখানে HQL-এ আপনি Java objects এবং properties ব্যবহার করেন।
  2. Portability:
    • HQL SQL এর মতোই ডেটাবেস থেকে ডেটা বের করে, তবে এটি ডেটাবেস নিরপেক্ষ, অর্থাৎ এটি বিভিন্ন ধরনের ডেটাবেসে কাজ করতে সক্ষম।
  3. Dynamic Queries:
    • HQL ডাইনামিক কুয়েরি সাপোর্ট করে, যার মাধ্যমে রানটাইমে কুয়েরি তৈরি করা যায়।
  4. Select, Update, Delete:
    • HQL তে select, update, delete ইত্যাদি কুয়েরি চালানো যায়, যেমন SQL-এ করা হয়, তবে এটি Java objects ব্যবহার করে।

HQL এর ব্যবহার:

1. SELECT Query

HQL-এ SELECT কুয়েরি সাধারণত Java Objects বা properties এর উপর কাজ করে।

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class Main {
    public static void main(String[] args) {
        // Hibernate configuration setup
        SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").addAnnotatedClass(User.class).buildSessionFactory();
        
        Session session = factory.getCurrentSession();
        
        try {
            session.beginTransaction();
            
            // HQL query
            String hql = "FROM User WHERE email = 'john.doe@example.com'";  // SELECT query using HQL
            Query query = session.createQuery(hql);
            User user = (User) query.uniqueResult();  // Fetching one result
            
            // Display the result
            System.out.println("User Details: " + user);
            
            session.getTransaction().commit();
        } finally {
            factory.close();
        }
    }
}

এখানে, FROM User ক্লাসের সমস্ত User অবজেক্টগুলি ফেরত দেয়, যেখানে email ফিল্ডের মান "john.doe@example.com"

2. SELECT Query with Fields

আপনি শুধুমাত্র কিছু নির্দিষ্ট ফিল্ডের জন্য SELECT কুয়েরি চালাতে পারেন।

String hql = "SELECT name, email FROM User WHERE id = 1";
Query query = session.createQuery(hql);
Object[] result = (Object[]) query.uniqueResult();
System.out.println("User Name: " + result[0] + ", Email: " + result[1]);

এখানে, শুধুমাত্র name এবং email ফিল্ডকে নির্বাচন করা হয়েছে।

3. UPDATE Query

HQL তে UPDATE কুয়েরি ব্যবহার করে কোনো অবজেক্টের ফিল্ড আপডেট করা যায়।

String hql = "UPDATE User SET name = :userName WHERE id = :userId";
Query query = session.createQuery(hql);
query.setParameter("userName", "New Name");
query.setParameter("userId", 1);
int result = query.executeUpdate(); // Executes the update query
System.out.println("Rows affected: " + result);

এখানে, User অবজেক্টের name ফিল্ডটি আপডেট করা হচ্ছে id = 1 অবজেক্টের জন্য।

4. DELETE Query

HQL তে DELETE কুয়েরি ব্যবহার করে অবজেক্ট মুছে ফেলা যায়।

String hql = "DELETE FROM User WHERE id = :userId";
Query query = session.createQuery(hql);
query.setParameter("userId", 1);
int result = query.executeUpdate(); // Executes the delete query
System.out.println("Rows affected: " + result);

এখানে, User টেবিল থেকে id = 1 এর জন্য রেকর্ড মুছে ফেলা হচ্ছে।

5. COUNT Query

HQL তে COUNT ফাংশন ব্যবহার করে ডেটার সংখ্যা বের করা যায়।

String hql = "SELECT COUNT(*) FROM User";
Query query = session.createQuery(hql);
long count = (long) query.uniqueResult();
System.out.println("Total Users: " + count);

এখানে, User টেবিলের মোট রেকর্ডের সংখ্যা বের করা হচ্ছে।


HQL এর সাথে আরও কিছু ফিচার

  1. Parameterized Queries:

    • HQL তে setParameter পদ্ধতি ব্যবহার করে কুয়েরিতে ডায়নামিক ভ্যালু পাস করা যায়।
    String hql = "FROM User WHERE email = :userEmail";
    Query query = session.createQuery(hql);
    query.setParameter("userEmail", "john.doe@example.com");
    
  2. JOIN Operations:

    • Hibernate তে একাধিক টেবিলের মধ্যে join অপারেশন করা যেতে পারে, যেমন SQL তে করা হয়।
    String hql = "FROM User u JOIN u.orders o WHERE o.status = :orderStatus";
    Query query = session.createQuery(hql);
    query.setParameter("orderStatus", "shipped");
    List<User> users = query.list();
    

    এখানে, User এবং Orders টেবিলের মধ্যে যোগসূত্র তৈরি করা হয়েছে।

  3. Pagination:

    • Hibernate কুয়েরির মাধ্যমে ডেটার পেজিনেশন করতে পারেন, অর্থাৎ আপনি কতটি রেকর্ড দেখাতে চান তা নির্ধারণ করতে পারেন।
    String hql = "FROM User";
    Query query = session.createQuery(hql);
    query.setFirstResult(0); // Starting index
    query.setMaxResults(10); // Number of records to fetch
    List<User> users = query.list();
    

HQL এর সুবিধা

  1. Object-Oriented:
    • HQL সম্পূর্ণভাবে object-oriented, এবং এতে Java objects এবং properties ব্যবহার করা হয়, যা SQL এর তুলনায় আরও প্রাকৃতিক এবং সুসংগঠিত।
  2. Database Independence:
    • HQL ডাটাবেস নিরপেক্ষ। আপনি যদি HQL ব্যবহার করেন, তবে আপনার কোডটি একাধিক ডেটাবেসের সাথে কাজ করতে সক্ষম হবে (যেমন MySQL, PostgreSQL, Oracle)।
  3. Simplified Syntax:
    • HQL এর সিনট্যাক্স SQL এর তুলনায় সহজ এবং বেশি জাভা-ফ্রেন্ডলি।
  4. Hibernate Features:
    • HQL Hibernate এর অন্যান্য ফিচারের সাথে পুরোপুরি কাজ করে, যেমন lazy loading, caching, এবং fetching strategies

Hibernate Query Language (HQL) হল Hibernate ORM ফ্রেমওয়ার্কের একটি শক্তিশালী বৈশিষ্ট্য, যা আপনাকে ডেটাবেস টেবিলের সাথে কাজ করার জন্য object-oriented কুয়েরি প্রদান করে। HQL SQL এর মতো হলেও এটি Java objects এবং তাদের properties ব্যবহার করে। এর মাধ্যমে SELECT, INSERT, UPDATE, DELETE এবং অন্যান্য কুয়েরি অপারেশন সহজভাবে করা সম্ভব হয়। HQL ব্যবহার করে আপনি ডেটাবেস ম্যানিপুলেশনকে আরও বেশি জাভা-ফ্রেন্ডলি এবং কার্যকরী করতে পারেন।

Content added By

HQL এর ধারণা এবং ব্যবহার

115
115

Hibernate Query Language (HQL) হল Hibernate ফ্রেমওয়ার্কের নিজস্ব একটি কুয়েরি ভাষা যা SQL এর মতো হলেও এটি object-oriented। এটি SQL-এর চেয়ে ভিন্ন কারণ এটি Java objects এবং entity classes এর মাধ্যমে কুয়েরি চালায়, আর relational database tables সরাসরি কুয়েরি করার পরিবর্তে Java objects এর উপর কাজ করে। HQL হল Hibernate ORM (Object-Relational Mapping) এর মাধ্যমে রিলেশনাল ডেটাবেসের সাথে যোগাযোগের জন্য ব্যবহৃত কুয়েরি ভাষা।


HQL এর বৈশিষ্ট্য

  1. Object-Oriented Querying:
    HQL ডেটাবেসের টেবিলের বদলে Java objects বা entities এর ওপর কুয়েরি চালায়। উদাহরণস্বরূপ, আপনি Employee নামক একটি entity ক্লাস ব্যবহার করতে পারেন, যা টেবিলের employee এর সঙ্গে ম্যাপিং হয়।
  2. SQL Syntax-এর অনুরূপ:
    HQL SQL এর মতোই দেখতে, কিন্তু এতে SELECT, FROM, WHERE ইত্যাদি ব্যবহৃত হলেও, এটি Java objects বা class-based কুয়েরি করে। HQL-এ table এবং column এর পরিবর্তে entity এবং property ব্যবহার করা হয়।
  3. Database Independence:
    HQL দিয়ে আপনি ডেটাবেসের নির্দিষ্ট ড্রাইভার বা ডায়ালেক্ট থেকে স্বাধীনভাবে ডেটাবেস কুয়েরি করতে পারেন, কারণ Hibernate স্বয়ংক্রিয়ভাবে ডেটাবেসের সাথে সামঞ্জস্যপূর্ণ কুয়েরি চালাবে।
  4. Parameter Binding:
    HQL কুয়েরি তৈরি করার সময় ডাইনামিক প্যারামিটারগুলি ব্যবহার করা সম্ভব, যা SQL-এর মতো নিরাপদ এবং কার্যকরী।

HQL কুয়েরির সাধারণ গঠন

HQL কুয়েরির একটি সাধারণ গঠন হল:

SELECT <property> FROM <EntityClass> WHERE <condition>

উদাহরণ:

  1. SELECT Query:

    SELECT e.name FROM Employee e WHERE e.salary > 50000
    

    এখানে, Employee ক্লাসের name প্রপার্টি এবং salary প্রপার্টি ব্যবহার করা হয়েছে। HQL-এ আমরা ক্লাসের নাম এবং ফিল্ড (প্রপার্টি) ব্যবহার করি।

  2. UPDATE Query:

    UPDATE Employee e SET e.salary = :newSalary WHERE e.id = :empId
    

    এখানে, :newSalary এবং :empId হল প্যারামিটার যা রানটাইমে সরবরাহ করা হবে।

  3. DELETE Query:

    DELETE FROM Employee e WHERE e.salary < 20000
    

HQL ব্যবহার করার উদাহরণ

Step 1: Hibernate Configuration Setup (hibernate.cfg.xml)

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- JDBC Database connection settings -->
        <property name="hibernate.connection.driver_class">org.h2.Driver</property>
        <property name="hibernate.connection.url">jdbc:h2:mem:testdb</property>
        <property name="hibernate.connection.username">sa</property>
        <property name="hibernate.connection.password"></property>

        <!-- JDBC connection pool settings -->
        <property name="hibernate.c3p0.min_size">5</property>
        <property name="hibernate.c3p0.max_size">20</property>

        <!-- Specify dialect -->
        <property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>

        <!-- Enable Hibernate's automatic session context management -->
        <property name="hibernate.current_session_context_class">thread</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="hibernate.show_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
        <property name="hibernate.hbm2ddl.auto">update</property>

        <!-- Disable the second-level cache -->
        <property name="hibernate.cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>
    </session-factory>
</hibernate-configuration>

Step 2: Entity Class (Employee.java)

import javax.persistence.*;

@Entity
@Table(name="employee")
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private int id;

    @Column(name="name")
    private String name;

    @Column(name="salary")
    private double salary;

    // Constructors, getters, and setters
    public Employee() {}

    public Employee(String name, double salary) {
        this.name = name;
        this.salary = salary;
    }

    // Getters and Setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
}

Step 3: HQL কুয়েরি চালানো (HQLExample.java)

import org.hibernate.*;
import org.hibernate.cfg.Configuration;

import java.util.List;

public class HQLExample {
    public static void main(String[] args) {

        // SessionFactory তৈরি করা
        SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
                .addAnnotatedClass(Employee.class)
                .buildSessionFactory();

        // সেশন তৈরি করা
        Session session = factory.getCurrentSession();

        try {
            // HQL কুয়েরি চালানো (সব Employees এর নাম সংগ্রহ করা যাদের salary 50000 এর বেশি)
            session.beginTransaction();
            List<String> employeeNames = session.createQuery("SELECT e.name FROM Employee e WHERE e.salary > 50000")
                                               .getResultList();
            for (String name : employeeNames) {
                System.out.println("Employee Name: " + name);
            }

            // HQL UPDATE কুয়েরি
            session.createQuery("UPDATE Employee e SET e.salary = 60000 WHERE e.salary < 50000")
                   .executeUpdate();

            // HQL DELETE কুয়েরি
            session.createQuery("DELETE FROM Employee e WHERE e.salary < 20000")
                   .executeUpdate();

            // ট্রানজেকশন কমিট করা
            session.getTransaction().commit();
        } finally {
            factory.close();
        }
    }
}

এখানে:

  • HQL Query: session.createQuery("SELECT e.name FROM Employee e WHERE e.salary > 50000") HQL কুয়েরি তৈরি করে, যেখানে e.name হল Employee entity এর name প্রপার্টি এবং e.salary হল salary প্রপার্টি।
  • Update Query: session.createQuery("UPDATE Employee e SET e.salary = 60000 WHERE e.salary < 50000") HQL দিয়ে salary কম থাকার Employee গুলোর salary আপডেট করা হয়।
  • Delete Query: session.createQuery("DELETE FROM Employee e WHERE e.salary < 20000") HQL দিয়ে salary কম থাকা Employee গুলি ডিলিট করা হয়।

HQL এর সুবিধা

  1. Object-Oriented Approach: HQL ডেটাবেস টেবিলের পরিবর্তে Java objects এর ওপর কুয়েরি চালায়, যার ফলে কোড object-oriented থাকে।
  2. Database Independence: HQL ডেটাবেস নিরপেক্ষ, কারণ Hibernate ডেটাবেসের জন্য প্রয়োজনীয় SQL ডায়ালেক্ট স্বয়ংক্রিয়ভাবে চয়ন করে।
  3. Simplified Querying: SQL এর মতো সহজে ডেটাবেসের উপর কুয়েরি চালানো সম্ভব হলেও এটি object properties ব্যবহার করে।
  4. Join Operations: HQL সহ সহজেই join অপারেশন করা সম্ভব, যেটি একাধিক টেবিলের মধ্যে সম্পর্ক তৈরি করতে সহায়ক।
  5. Parameter Binding: HQL প্যারামিটার ব্যন্ডিং সমর্থন করে, যা SQL injection এর বিরুদ্ধে সুরক্ষা প্রদান করে।

HQL এর চ্যালেঞ্জ

  1. Complex Queries: জটিল এবং multi-table joins এর জন্য HQL মাঝে মাঝে খুবই জটিল হতে পারে, বিশেষত বড় এবং বৃহৎ স্কেল অ্যাপ্লিকেশনগুলিতে।
  2. Performance: Hibernate ক্যাশিং এবং কিছু ক্ষেত্রেই query optimization এর ক্ষেত্রে পারফরম্যান্স প্রভাব ফেলতে পারে।
  3. Limited Functions: SQL-এর তুলনায় HQL কিছু ক্ষেত্রে কম ফাংশনালিটি এবং জটিলতা প্রদান করতে পারে।

Hibernate Query Language (HQL) একটি শক্তিশালী এবং object-oriented কুয়েরি ভাষা যা Hibernate ফ্রেমওয়ার্কের সাথে ডেটাবেসে ডেটা অ্যাক্সেস করতে ব্যবহৃত হয়। এটি SQL এর মতো দেখতে হলেও, HQL Java objects-এর উপর কুয়েরি চালায় এবং database independence, simplified querying এবং parameter binding প্রদান করে। HQL Hibernate অ্যাপ্লিকেশনের জন্য একটি গুরুত্বপূর্ণ অংশ, কারণ এটি ডেটাবেস অপারেশনগুলো অবজেক্ট-ওরিয়েন্টেডভাবে পরিচালনা করতে সাহায্য করে।

Content added By

HQL এবং SQL এর মধ্যে পার্থক্য

102
102

HQL (Hibernate Query Language) এবং SQL (Structured Query Language) দুটি ডেটাবেস কুয়েরি ভাষা হলেও, তাদের মধ্যে কিছু মৌলিক পার্থক্য রয়েছে। Hibernate Query Language (HQL) হল Hibernate ফ্রেমওয়ার্কের জন্য একটি কাস্টম কুয়েরি ভাষা যা Java objects এবং ডেটাবেস টেবিলের মধ্যে সম্পর্ক তৈরি করে, যেখানে SQL হল ডেটাবেসের সঙ্গে সরাসরি যোগাযোগ করার জন্য ব্যবহৃত একটি স্ট্যান্ডার্ড কুয়েরি ভাষা।

এখানে HQL এবং SQL এর মধ্যে প্রধান পার্থক্যগুলো আলোচনা করা হয়েছে।


1. Object-Oriented vs Relational

  • HQL (Hibernate Query Language):
    • HQL একটি object-oriented query language, যা Java objects এর উপর ভিত্তি করে কাজ করে। এটি Java classes এবং their relationships (উদাহরণস্বরূপ, একে অপরের মধ্যে inheritance বা association) এর উপর কাজ করে।
    • HQL এ আপনি entities এবং their properties এর সাথে কাজ করেন, এবং tables বা columns এর পরিবর্তে objects এবং fields ব্যবহার করেন।
    • উদাহরণ:

      FROM User u WHERE u.name = 'John'
      

      এখানে User হল একটি Java class (entity), এবং u.name হল সেই class এর একটি property।

  • SQL (Structured Query Language):
    • SQL হল relational query language, যা ডেটাবেসের tables এবং columns এর উপর কাজ করে।
    • SQL এ আপনাকে ডেটাবেসের টেবিলের নাম এবং কলামের নাম ব্যবহার করে কুয়েরি লিখতে হয়।
    • উদাহরণ:

      SELECT * FROM users WHERE name = 'John';
      

      এখানে users হল একটি টেবিল এবং name একটি কলাম।

তুলনা:

  • HQL: Object-oriented (Java classes and their properties).
  • SQL: Relational-oriented (Tables and columns).

2. HQL Uses Entity Names; SQL Uses Table Names

  • HQL:
    • HQL এ আপনি Java entity class এর নাম ব্যবহার করেন, এবং সেই class এর প্রপার্টি (fields) কে columns হিসেবে ম্যাপ করা হয়। HQL এর মাধ্যমে Java objects ম্যানিপুলেট করা হয়।
  • SQL:
    • SQL এ আপনাকে সরাসরি tables এবং columns এর নাম ব্যবহার করতে হয়। SQL ডেটাবেসের বাস্তব কাঠামো (tables and columns) এর উপর ভিত্তি করে কাজ করে।

তুলনা:

  • HQL: Java entity classes and their properties.
  • SQL: Database tables and columns.

3. HQL is Database-Independent; SQL is Database-Specific

  • HQL:
    • HQL একটি database-independent query language, কারণ এটি Hibernate ফ্রেমওয়ার্ক ব্যবহার করে এবং Hibernate বিভিন্ন ডেটাবেসের জন্য অটোমেটিক কুয়েরি ট্রান্সলেশন এবং অপটিমাইজেশন করতে পারে।
    • Hibernate আপনার HQL কুয়েরিকে ডাটাবেস-নির্দিষ্ট SQL কোডে রূপান্তরিত করে, যার মানে হল যে HQL ডেটাবেস পরিবর্তন করে কাজ করতে পারে।
  • SQL:
    • SQL একটি database-specific query language, কারণ SQL কুয়েরিগুলি প্রতিটি ডেটাবেস সিস্টেমের জন্য আলাদা হতে পারে (যেমন, MySQL, PostgreSQL, Oracle)। প্রতিটি ডেটাবেসের জন্য SQL কুয়েরি সঠিকভাবে কাজ করার জন্য কিছু নির্দিষ্ট কনফিগারেশন বা কাস্টমাইজেশন প্রয়োজন।

তুলনা:

  • HQL: Database-independent.
  • SQL: Database-specific.

4. HQL Supports Object Associations; SQL Does Not

  • HQL:
    • HQL এ আপনি object associations এবং relations যেমন one-to-many, many-to-one, many-to-many, inheritance ইত্যাদি খুব সহজে কোয়েরি করতে পারেন।
    • HQL ডাটাবেসের টেবিলের মধ্যে সম্পর্কগুলোকে Java objects এবং তাদের relationships হিসেবে পরিচালনা করে।
  • SQL:
    • SQL শুধুমাত্র ডেটাবেসের tables এর মধ্যে সম্পর্ক (joins) পরিচালনা করতে সক্ষম, তবে এটি Java objects এর সম্পর্ক পরিচালনা করতে পারে না।

তুলনা:

  • HQL: Supports object associations (e.g., one-to-many, many-to-one).
  • SQL: Supports relational data through joins.

5. HQL Supports Automatic Join; SQL Requires Explicit Join

  • HQL:
    • HQL এর মাধ্যমে, Hibernate automatic joins পরিচালনা করতে পারে, যা সম্পর্কিত entities এর মধ্যে joins ব্যবস্থাপনা করতে সহায়ক। Hibernate নিজেই associative relationships বুঝে, এবং যেটি প্রয়োজন, সেই টেবিলের মধ্যে joins তৈরি করে।
  • SQL:
    • SQL এ আপনাকে explicit joins ব্যবহার করতে হয়, যেখানে টেবিলগুলির মধ্যে সম্পর্ক নির্ধারণ করতে স্পষ্টভাবে JOIN বা INNER JOIN ব্যবহার করতে হয়।

তুলনা:

  • HQL: Automatic joins based on object associations.
  • SQL: Explicit joins using JOIN clause.

6. HQL Supports Polymorphic Queries; SQL Does Not

  • HQL:
    • HQL polymorphic queries সাপোর্ট করে, অর্থাৎ এটি inheritance সম্পর্কিত ক্লাস গুলির মধ্যে কুয়েরি চালাতে পারে। যখন আপনি একাধিক subclass বা entity hierarchy ব্যবহার করেন, HQL তার মধ্যে polymorphic queries চালাতে সক্ষম।
  • SQL:
    • SQL এ inheritance সম্পর্কিত ডেটা পরিচালনা করা কঠিন, কারণ SQL শুধুমাত্র টেবিল এবং কলামের ডেটা পরিচালনা করে এবং ডেটাবেসের মধ্যে inheritance সম্পর্কের সাপোর্ট নেই।

তুলনা:

  • HQL: Supports polymorphic queries with inheritance.
  • SQL: Does not support polymorphism.

7. Syntax Differences

  • HQL:
    • HQL এর সিনট্যাক্স SQL এর থেকে কিছুটা ভিন্ন, কারণ এটি Java objects এবং তাদের properties এর উপর ভিত্তি করে কাজ করে।
    • উদাহরণ:

      FROM User u WHERE u.name = 'John'
      
  • SQL:
    • SQL সাধারণভাবে tables এবং columns এর উপর ভিত্তি করে কাজ করে।
    • উদাহরণ:

      SELECT * FROM users WHERE name = 'John';
      

তুলনা:

  • HQL: FROM User u WHERE u.name = 'John' (Java objects, properties).
  • SQL: SELECT * FROM users WHERE name = 'John' (Database tables, columns).

FeatureHQL (Hibernate Query Language)SQL (Structured Query Language)
Query TypeObject-oriented (Java objects)Relational-oriented (Tables and columns)
Database IndependenceYes, Hibernate handles database-specific SQLNo, database-specific SQL syntax required
Supports Object RelationshipsYes (e.g., one-to-many, many-to-one)No (only through JOIN operations)
Polymorphic QueriesYes (supports inheritance)No (cannot handle object inheritance)
JoinsAutomatic joins based on object relationsExplicit joins using JOIN keyword
SyntaxJava objects and propertiesDatabase tables and columns

HQL হল Hibernate এর নিজস্ব কুয়েরি ভাষা যা Java objects এবং তাদের সম্পর্কের উপর কাজ করে, যা ORM ভিত্তিক অ্যাপ্লিকেশনগুলির জন্য অত্যন্ত উপযোগী। অন্যদিকে, SQL একটি ডেটাবেস ভিত্তিক ভাষা যা ডেটাবেসের টেবিল এবং কলামগুলির উপর কাজ করে। HQL আপনাকে ডেটাবেসের সাথে কাজ করার সময় object-oriented ফিচারগুলি প্রদান করে, যেখানে SQL সরাসরি ডেটাবেস টেবিলের সাথে কাজ করে।

Content added By

HQL Query লিখা এবং Execute করা

150
150

HQL (Hibernate Query Language) হল Hibernate এর জন্য তৈরি করা একটি Object-Oriented Query Language যা SQL এর মতো দেখতে হলেও SQL নয়। এটি Hibernate Entity Objects এবং তাদের প্রোপার্টিগুলির উপর ভিত্তি করে কাজ করে। HQL দিয়ে আপনি Java objects এবং database tables এর মধ্যে সম্পর্ক স্থাপন করতে পারেন এবং ডেটাবেস থেকে ডেটা পুনরুদ্ধার বা আপডেট করতে পারেন।

HQL এর মাধ্যমে SQL কোড লেখার প্রয়োজনীয়তা কমে যায় এবং ডেটাবেসের সাথে সম্পর্কিত Java classes এর মধ্যে ম্যাপিং সরাসরি ব্যবহার করা সম্ভব হয়।

HQL Query লিখা এবং Execute করা:

1. HQL এর মূল বৈশিষ্ট্য:

  • HQL Object-Oriented: HQL ডেটাবেস টেবিলের পরিবর্তে Java objects এবং তাদের প্রপার্টি ব্যবহার করে।
  • SQL-এর মতো: HQL SQL এর মতোই কাজ করে, কিন্তু এটি Java objects এবং তাদের properties এর সাথে কাজ করে।
  • Case-insensitive: HQL query গুলি সাধারণত case-insensitive (অথবা অক্ষরের বড় এবং ছোট পার্থক্য থাকে না)।

2. HQL Query এর উদাহরণ

ধরা যাক, আমাদের Employee Entity Class আছে এবং আমরা এই ক্লাসের মাধ্যমে ডেটাবেসে কোয়েরি চালাতে চাই। নিচে HQL এর মাধ্যমে কিছু সাধারণ query example দেওয়া হলো:

import javax.persistence.*;
import java.util.List;

@Entity
@Table(name="employee")
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String name;
    private String department;
    private double salary;

    // Getters and Setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
}

3. HQL Query এর মাধ্যমে ডেটা Retrieve করা

Example 1: Simple HQL Query (Select All Employees)

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;

import java.util.List;

public class HibernateApp {
    public static void main(String[] args) {

        // Create session factory
        SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").addAnnotatedClass(Employee.class).buildSessionFactory();

        // Create session
        Session session = factory.getCurrentSession();

        try {
            // Start a transaction
            session.beginTransaction();

            // Create HQL query to get all employees
            Query<Employee> query = session.createQuery("from Employee", Employee.class);

            // Execute query and get result list
            List<Employee> employees = query.getResultList();

            // Display the results
            for (Employee emp : employees) {
                System.out.println(emp.getName());
            }

            // Commit transaction
            session.getTransaction().commit();
        } finally {
            factory.close();
        }
    }
}

Explanation:

  • from Employee: এটি HQL এর মাধ্যমে Employee Entity ক্লাসের সমস্ত রেকর্ডগুলি অনুরোধ করে।
  • getResultList(): এই মেথডটি Employee তালিকাতে সমস্ত রেকর্ড ফেরত দেয়।

Example 2: Using WHERE Clause (Select Employees with Specific Condition)

public class HibernateApp {
    public static void main(String[] args) {
        SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").addAnnotatedClass(Employee.class).buildSessionFactory();
        Session session = factory.getCurrentSession();

        try {
            session.beginTransaction();

            // HQL query with WHERE condition
            Query<Employee> query = session.createQuery("from Employee where department='IT'");

            List<Employee> employees = query.getResultList();

            for (Employee emp : employees) {
                System.out.println(emp.getName());
            }

            session.getTransaction().commit();
        } finally {
            factory.close();
        }
    }
}

Explanation:

  • where department='IT': এটি সেই সমস্ত Employee রেকর্ড ফেরত দেবে যেখানে department এর মান 'IT'

Example 3: Using LIKE Clause (Pattern Matching)

public class HibernateApp {
    public static void main(String[] args) {
        SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").addAnnotatedClass(Employee.class).buildSessionFactory();
        Session session = factory.getCurrentSession();

        try {
            session.beginTransaction();

            // HQL query using LIKE for pattern matching
            Query<Employee> query = session.createQuery("from Employee where name like 'J%'");

            List<Employee> employees = query.getResultList();

            for (Employee emp : employees) {
                System.out.println(emp.getName());
            }

            session.getTransaction().commit();
        } finally {
            factory.close();
        }
    }
}

Explanation:

  • like 'J%': এটি সমস্ত Employee রেকর্ডগুলি ফেরত দেবে যার name 'J' দিয়ে শুরু হয়।

Example 4: Using ORDER BY Clause (Sorting Results)

public class HibernateApp {
    public static void main(String[] args) {
        SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").addAnnotatedClass(Employee.class).buildSessionFactory();
        Session session = factory.getCurrentSession();

        try {
            session.beginTransaction();

            // HQL query to get employees sorted by name
            Query<Employee> query = session.createQuery("from Employee order by name");

            List<Employee> employees = query.getResultList();

            for (Employee emp : employees) {
                System.out.println(emp.getName());
            }

            session.getTransaction().commit();
        } finally {
            factory.close();
        }
    }
}

Explanation:

  • order by name: এটি সমস্ত Employee রেকর্ডগুলো name এর আঙ্গিক অনুযায়ী সজ্জিত করবে।

4. HQL Update এবং Delete Queries

Update Example: (Update Employee Salary)

public class HibernateApp {
    public static void main(String[] args) {
        SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").addAnnotatedClass(Employee.class).buildSessionFactory();
        Session session = factory.getCurrentSession();

        try {
            session.beginTransaction();

            // HQL query to update salary of employees
            Query query = session.createQuery("update Employee set salary=5000 where department='IT'");
            int result = query.executeUpdate();

            System.out.println("Rows affected: " + result);

            session.getTransaction().commit();
        } finally {
            factory.close();
        }
    }
}

Explanation:

  • update Employee set salary=5000 where department='IT': এটি সকল IT বিভাগের কর্মীদের salary ৫০০০ করে আপডেট করবে।

Delete Example: (Delete Employee by ID)

public class HibernateApp {
    public static void main(String[] args) {
        SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").addAnnotatedClass(Employee.class).buildSessionFactory();
        Session session = factory.getCurrentSession();

        try {
            session.beginTransaction();

            // HQL query to delete an employee
            Query query = session.createQuery("delete from Employee where id=1");
            int result = query.executeUpdate();

            System.out.println("Rows affected: " + result);

            session.getTransaction().commit();
        } finally {
            factory.close();
        }
    }
}

Explanation:

  • delete from Employee where id=1: এটি id=1 এর Employee রেকর্ডটি ডিলিট করবে।

5. HQL Query Execution Summary

  • HQL (Hibernate Query Language) ব্যবহার করে আপনি Java objects এর উপর ভিত্তি করে ডেটাবেস অপারেশন করতে পারেন, যেখানে SQL কোড লেখার প্রয়োজন নেই।
  • HQL-এ object-oriented syntax ব্যবহার করা হয় যা SQL এর তুলনায় অনেক বেশি সুবিধাজনক এবং পাঠযোগ্য।
  • আপনি select, update, delete, এবং insert অপারেশনগুলি HQL-এ সম্পাদন করতে পারেন, যেগুলির সাথে Java objects এবং database tables এর মধ্যে সম্পর্ক স্থাপন করতে হয়।

HQL Query Syntax সহজে ব্যবহারযোগ্য এবং Hibernate-এর শক্তিশালী ORM সক্ষমতা ব্যবহার করে object-relational mapping সহজ করে তোলে।

Content added By

Named Query এবং Native SQL Query

161
161

Hibernate (হাইবারনেট) একটি ORM (Object-Relational Mapping) ফ্রেমওয়ার্ক যা Java অ্যাপ্লিকেশন ডেভেলপমেন্টের জন্য ব্যবহৃত হয়। Hibernate আপনাকে Named Query এবং Native SQL Query এর মাধ্যমে ডেটাবেস থেকে ডেটা আহরণের জন্য কুয়েরি চালানোর সুবিধা প্রদান করে।

নিচে Named Query এবং Native SQL Query সম্পর্কিত বিস্তারিত আলোচনা করা হয়েছে।


1. Named Query

Named Query Hibernate-এর একটি শক্তিশালী বৈশিষ্ট্য, যা আপনাকে পূর্ব-সংজ্ঞায়িত (predefined) SQL বা HQL (Hibernate Query Language) কুয়েরি সংরক্ষণ করতে সহায়তা করে। এর মাধ্যমে আপনি কুয়েরি রিচুয়াল এবং ফিচারের জন্য কোড পুনঃব্যবহারযোগ্যতা এবং কনভেনিয়েন্স অর্জন করতে পারেন। Named Query সাধারণত হাইবারনেট @NamedQuery অ্যানোটেশন বা XML কনফিগারেশনের মাধ্যমে তৈরি করা হয়।

Named Query এর ব্যবহার:

  1. HQL Named Query: Hibernate-এ HQL ব্যবহার করে একটি Named Query তৈরি করা হয়। HQL হল Hibernate-এর কুয়েরি ভাষা, যা SQL এর মতো হলেও এটি Java objects (Entity classes) এবং তাদের অ্যাসোসিয়েশনগুলির সাথে কাজ করে।

Named Query তৈরি করা:

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQuery;

@Entity
@NamedQuery(name = "User.findByName", query = "FROM User u WHERE u.name = :name")
public class User {
    @Id
    private int id;
    private String name;
    private String email;

    // Getters and Setters
}

এখানে, @NamedQuery ব্যবহার করা হয়েছে যা User ক্লাসের মধ্যে findByName নামে একটি named query তৈরি করে। এই কুয়েরি User টেবিল থেকে সেই ইউজারের ডেটা বের করবে যাদের নাম :name প্যারামিটার সমান।

Named Query ব্যবহার করা:

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateNamedQueryExample {
    public static void main(String[] args) {
        SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
                .addAnnotatedClass(User.class)
                .buildSessionFactory();

        Session session = factory.getCurrentSession();

        try {
            // Start a transaction
            session.beginTransaction();

            // Execute Named Query
            String name = "John Doe";
            User user = (User) session.createNamedQuery("User.findByName")
                                      .setParameter("name", name)
                                      .uniqueResult();

            // Display the result
            System.out.println("User found: " + user);

            session.getTransaction().commit();
        } finally {
            factory.close();
        }
    }
}

এখানে, createNamedQuery() পদ্ধতি ব্যবহার করে Named Query চালানো হয়েছে এবং প্যারামিটার হিসেবে ইউজারের নাম পাঠানো হয়েছে।

Named Query এর সুবিধা:

  • Reusability: একই কুয়েরি একাধিক জায়গায় ব্যবহার করা যায়।
  • Maintainability: কুয়েরি এক জায়গায় সংরক্ষিত থাকে, পরিবর্তন করা সহজ হয়।
  • Performance: Hibernate কুয়েরি কম্পাইল এবং অপটিমাইজ করে, যা কর্মক্ষমতা বৃদ্ধি করতে সাহায্য করে।

2. Native SQL Query

Hibernate-এ Native SQL Query ব্যবহার করলে আপনি সরাসরি ডেটাবেসে নির্দিষ্ট SQL কুয়েরি চালাতে পারেন। এই কুয়েরি ডেটাবেস নির্দিষ্ট (Database-specific) হতে পারে, এবং Hibernate এর HQL থেকে ভিন্ন, এটি ডেটাবেসের actual SQL সিন্দৃশ (syntax) অনুসরণ করে। Hibernate আপনাকে Native SQL কুয়েরি চালানোর জন্য createSQLQuery() পদ্ধতি সরবরাহ করে।

Native SQL Query এর উদাহরণ:

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateNativeQueryExample {
    public static void main(String[] args) {
        SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
                .addAnnotatedClass(User.class)
                .buildSessionFactory();

        Session session = factory.getCurrentSession();

        try {
            // Start a transaction
            session.beginTransaction();

            // Execute Native SQL Query
            String sql = "SELECT * FROM users WHERE name = :name";
            User user = (User) session.createSQLQuery(sql)
                                      .addEntity(User.class)
                                      .setParameter("name", "John Doe")
                                      .uniqueResult();

            // Display the result
            System.out.println("User found: " + user);

            session.getTransaction().commit();
        } finally {
            factory.close();
        }
    }
}

এখানে, createSQLQuery() পদ্ধতি ব্যবহার করে একটি Native SQL Query চালানো হয়েছে, যা ডেটাবেসের users টেবিল থেকে ইউজারের তথ্য নিয়ে আসে।

Native SQL Query এর সুবিধা:

  • Database-specific functionality: Native SQL ব্যবহার করার মাধ্যমে ডেটাবেসের নির্দিষ্ট কার্যকারিতা, ফাংশন এবং অপ্টিমাইজেশান সুবিধা পাওয়া যায়।
  • Direct SQL Execution: Hibernate কেবল SQL কুয়েরি পরিচালনা করে, তাই এটি ডেটাবেসের সঙ্গে সরাসরি কাজ করতে সক্ষম।
  • Complex Queries: যখন HQL সীমাবদ্ধতা থাকে, তখন Native SQL এর মাধ্যমে আরও জটিল কুয়েরি তৈরি করা যায়।

Native SQL Query এর কিছু সীমাবদ্ধতা:

  • Database Dependency: Native SQL ডেটাবেস নির্দিষ্ট, তাই আপনার অ্যাপ্লিকেশনটি একাধিক ডেটাবেসে চলে না।
  • Less Abstraction: Hibernate এর object-relational mapping সুবিধা Native SQL এ পাওয়া যায় না, যেমন Hibernate এ Entity ফিচারের সাথে সম্পর্কিত কাজ।

Named Query vs Native SQL Query:

CriteriaNamed QueryNative SQL Query
LanguageHQL (Hibernate Query Language)Actual SQL (Database-specific SQL syntax)
Abstraction LevelHigh abstraction (works with Java objects)Low abstraction (works with raw SQL and database tables)
Database IndependenceDatabase-independent (works across different DBs)Database-specific (depends on the DB's SQL syntax)
ComplexitySimpler for basic queriesSuitable for complex or database-specific queries
PerformanceMay be less optimized in certain casesOptimized for specific database features
Use CaseSuitable for object-based queriesSuitable for database-specific queries (complex joins, functions)

Hibernate-এ Named Query এবং Native SQL Query দুটোই গুরুত্বপূর্ণ এবং কার্যকরী কুয়েরি প্রক্রিয়া, তবে তাদের ব্যবহার পরিস্থিতির ওপর নির্ভর করে। Named Query সাধারণত ব্যবহৃত হয় যখন আপনি ডেটাবেসের অযথা নির্দিষ্ট SQL সিনট্যাক্স থেকে অবাধ থাকতে চান, এবং Native SQL তখন ব্যবহার করা হয় যখন আপনার ডেটাবেসের নির্দিষ্ট ক্ষমতাগুলি যেমন complex joins, stored procedures ইত্যাদি ব্যবহার করতে হয়।

Content added By
Promotion