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

Hibernate Query Language (HQL) - হাইবারনেট (Hibernate) - Java Technologies

349

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
Promotion

Are you sure to start over?

Loading...