Query Language (JPQL)

Java Technologies - জেপিএ  (JPA)
87
87

JPQL (Java Persistence Query Language) হল JPA (Java Persistence API) এর জন্য একটি কুয়েরি ভাষা যা SQL এর মতো দেখায় কিন্তু এটি ডেটাবেস টেবিলের পরিবর্তে Java অবজেক্ট (Entity) এর উপর কাজ করে। JPQL ব্যবহার করে, ডেভেলপাররা Java অবজেক্টগুলির মধ্যে ডেটা অনুসন্ধান এবং মানিপুলেশন করতে পারেন, যা ডেটাবেস টেবিলের উপরে তৈরি SQL কুয়েরি থেকে অনেক বেশি পরিষ্কার এবং সহজ।

JPQL SQL এর মতো দেখতে হলেও, এটি Java Object এবং Entity ক্লাসের ওপর কাজ করে। JPQL কুয়েরি লিখতে, আপনাকে টেবিলের নামের পরিবর্তে Entity ক্লাসের নাম এবং তাদের প্রপার্টি ব্যবহার করতে হয়। এটি SQL এর চেয়ে বেশি অবজেক্ট-অরিয়েন্টেড এবং Object-Relational Mapping (ORM) প্রযুক্তির অংশ।

JPQL এর মৌলিক গঠন


JPQL কুয়েরির মূল গঠন SQL কুয়েরির মতোই, তবে এটি অবজেক্ট ও প্রপার্টি ভিত্তিক। মূল বৈশিষ্ট্যগুলো হল:

  • Entity নাম: SQL এর টেবিল নামের বদলে, Entity ক্লাসের নাম ব্যবহার করা হয়।
  • Entity ফিল্ড: SQL এর কলাম নামের বদলে, Entity এর প্রপার্টি নাম ব্যবহার করা হয়।
  • SELECT, FROM, WHERE: SQL এর মতোই কুয়েরির প্রধান অংশ থাকে।

JPQL কুয়েরির উদাহরণ


1. সিলেক্ট কুয়েরি

String jpql = "SELECT u FROM User u WHERE u.age > 25";
TypedQuery<User> query = entityManager.createQuery(jpql, User.class);
List<User> users = query.getResultList();

এখানে:

  • SELECT u – Entity User এর সব অবজেক্টকে সিলেক্ট করা হচ্ছে।
  • FROM User uUser Entity ক্লাস থেকে ডেটা রিটার্ন করা হচ্ছে।
  • WHERE u.age > 25 – যেখানে age ফিল্ড ২৫ এর বেশি, সেগুলিকে রিটার্ন করা হবে।

2. COUNT কুয়েরি

String jpql = "SELECT COUNT(u) FROM User u";
TypedQuery<Long> query = entityManager.createQuery(jpql, Long.class);
Long count = query.getSingleResult();

এখানে:

  • COUNT(u): এই কুয়েরি User Entity এর রেকর্ডের মোট সংখ্যা ফেরত দেবে।

3. ORDER BY কুয়েরি

String jpql = "SELECT u FROM User u ORDER BY u.name ASC";
TypedQuery<User> query = entityManager.createQuery(jpql, User.class);
List<User> users = query.getResultList();

এখানে:

  • ORDER BY u.name ASC: User Entity এর নামের উপর ভিত্তি করে ASCENDING অর্ডারে রেকর্ডগুলি রিটার্ন করা হবে।

4. LIMIT/OFFSET (Pagination)

String jpql = "SELECT u FROM User u ORDER BY u.name";
TypedQuery<User> query = entityManager.createQuery(jpql, User.class);
query.setFirstResult(0); // প্রথম 0 তম রেকর্ড থেকে শুরু
query.setMaxResults(10); // সর্বোচ্চ 10টি রেকর্ড রিটার্ন করা হবে
List<User> users = query.getResultList();

এখানে:

  • setFirstResult(0): প্রথম ১০টি রেকর্ড (যা ০ থেকে শুরু হবে) রিটার্ন করবে।
  • setMaxResults(10): সর্বোচ্চ ১০টি রেকর্ড রিটার্ন হবে।

JPQL তে JOIN ব্যবহার


JPQL তে JOIN ব্যবহার করে একাধিক Entity এর মধ্যে সম্পর্ক স্থাপন করা হয়। যেমন, OneToMany, ManyToOne বা ManyToMany রিলেশনশিপে থাকা ডেটার জন্য JOIN কুয়েরি ব্যবহার করা যায়।

1. INNER JOIN Example

String jpql = "SELECT o FROM Order o JOIN o.user u WHERE u.name = :name";
TypedQuery<Order> query = entityManager.createQuery(jpql, Order.class);
query.setParameter("name", "John Doe");
List<Order> orders = query.getResultList();

এখানে:

  • JOIN o.user u: Order Entity এবং User Entity এর মধ্যে একটি INNER JOIN করা হয়েছে, যেখানে Order Entity এর user প্রপার্টির সাথে User Entity যুক্ত হয়েছে।
  • WHERE u.name = :name: User Entity এর নামের ভিত্তিতে ফিল্টার করা হয়েছে।

2. LEFT JOIN Example

String jpql = "SELECT o FROM Order o LEFT JOIN o.user u WHERE u.name = :name";
TypedQuery<Order> query = entityManager.createQuery(jpql, Order.class);
query.setParameter("name", "Jane Doe");
List<Order> orders = query.getResultList();

এখানে:

  • LEFT JOIN o.user u: এটি একটি LEFT JOIN যেখানে Order Entity এর সাথে User Entity যুক্ত হয়েছে, তবে User Entity না থাকলেও Order Entity রিটার্ন হবে।

JPQL এর Advanced Features


  1. Named Queries: JPQL এর মধ্যে Named Queries ব্যবহার করা হয়, যা কোডের বাইরের XML ফাইল বা অ্যানোটেশন ভিত্তিক ব্যবহারের মাধ্যমে কুয়েরি সংজ্ঞায়িত করে।

    উদাহরণ:

    @Entity
    @NamedQuery(name = "User.findByAge", query = "SELECT u FROM User u WHERE u.age > :age")
    public class User { ... }
    

    এরপর, এই Named Query ব্যবহার করা যাবে:

    TypedQuery<User> query = entityManager.createNamedQuery("User.findByAge", User.class);
    query.setParameter("age", 25);
    List<User> users = query.getResultList();
    
  2. Aggregation Functions: JPQL এ SQL এর মতো AVG, MAX, MIN, SUM ফাংশন ব্যবহার করা যেতে পারে ডেটার উপর সঞ্চালন করতে।

    উদাহরণ:

    String jpql = "SELECT AVG(u.age) FROM User u";
    TypedQuery<Double> query = entityManager.createQuery(jpql, Double.class);
    Double avgAge = query.getSingleResult();
    
  3. Subqueries: JPQL তে সাবকুয়েরি (subquery) ব্যবহার করা যেতে পারে একটি কুয়েরির মধ্যে অন্য কুয়েরি রান করতে।

    উদাহরণ:

    String jpql = "SELECT u FROM User u WHERE u.age = (SELECT MAX(u2.age) FROM User u2)";
    TypedQuery<User> query = entityManager.createQuery(jpql, User.class);
    User oldestUser = query.getSingleResult();
    

সার্বিক পর্যালোচনা


JPQL (Java Persistence Query Language) হল JPA এর একটি শক্তিশালী কুয়েরি ভাষা যা ডেটাবেস টেবিলের পরিবর্তে Java অবজেক্টের ওপর কাজ করে। এটি SQL এর মতো দেখতে হলেও, JPQL Java অবজেক্ট এবং তাদের ফিল্ডের উপর ভিত্তি করে কুয়েরি তৈরি করে। JPQL সহজে ডেটাবেসে ডেটা অনুসন্ধান, ম্যানিপুলেশন, এবং সম্পর্কিত টেবিলগুলির মধ্যে সম্পর্ক স্থাপন করতে সাহায্য করে।

JPQL এর মাধ্যমে:

  • Entity ফিল্ডের উপর ভিত্তি করে কুয়েরি লেখা যায়।
  • JOIN ব্যবহারের মাধ্যমে একাধিক Entity সম্পর্কিত ডেটা পাওয়া যায়।
  • Aggregation functions এবং subqueries এর মাধ্যমে জটিল ডেটা অনুসন্ধান করা সম্ভব হয়।

JPQL ডেটাবেস অপারেশনগুলোকে কার্যকরী এবং সহজভাবে ম্যানেজ করার একটি উপায় প্রদান করে, যা Java অ্যাপ্লিকেশনগুলির পারফরম্যান্স এবং রক্ষণাবেক্ষণ সহজ করে তোলে।

Content added By

JPQL (Java Persistence Query Language) এর ভূমিকা

81
81

JPQL (Java Persistence Query Language) হল একটি স্ট্যান্ডার্ড কুয়েরি ভাষা যা JPA (Java Persistence API) এর মধ্যে ব্যবহৃত হয়। এটি একটি অবজেক্ট-ওরিয়েন্টেড কুয়েরি ভাষা যা ডেটাবেস টেবিলের উপর নয়, বরং Java অবজেক্ট এর উপর কাজ করে। JPQL এর মাধ্যমে আপনি Entity গুলির উপর কুয়েরি চালাতে পারেন, যা JPA Entity গুলোর ডেটাকে রিলেশনাল ডেটাবেস থেকে সংগ্রহ করতে সহায়তা করে। এটি SQL এর মতোই দেখতে, কিন্তু এটি Java অবজেক্ট এবং তাদের প্রপার্টির সাথে কাজ করে।

JPQL এর ভূমিকা


JPQL (Java Persistence Query Language) এর ভূমিকা হল Java অবজেক্টগুলির উপর ভিত্তি করে ডেটাবেস থেকে ডেটা খোঁজা। এটি ডেটাবেসে SQL কুয়েরি পাঠানোর পরিবর্তে JPA Entity গুলির উপর কুয়েরি পরিচালনা করে, যার ফলে ডেটাবেস এবং Java অবজেক্টের মধ্যে সম্পর্ক খুব সহজভাবে ম্যানেজ করা যায়।

  • SQL এর তুলনায় Object-Oriented: JPQL সরাসরি ডেটাবেসের টেবিলের উপর কাজ না করে, Java অবজেক্টের উপর কাজ করে।
  • JPA Entity এর সাথে কাজ: JPQL শুধুমাত্র Java ক্লাস বা Entity এর সাথে কাজ করে, যা ডেটাবেস টেবিলের প্রতিনিধিত্ব করে।
  • স্ট্যান্ডার্ড কুয়েরি ভাষা: JPQL JPA এর অংশ হওয়ায়, এটি একটি স্ট্যান্ডার্ড কুয়েরি ভাষা, যা JPA এর মাধ্যমে ডেটাবেসে কুয়েরি চালানোর জন্য ব্যবহৃত হয়।

JPQL এর মাধ্যমে আপনি SELECT, UPDATE, DELETE, INSERT ইত্যাদি SQL অপারেশন করতে পারেন, তবে এটি Java অবজেক্টগুলির ওপর ভিত্তি করে কাজ করবে।

JPQL এর মূল বৈশিষ্ট্য


  1. Object-Oriented: JPQL SQL এর মতো হলেও, এটি ডেটাবেসের টেবিলের পরিবর্তে Java অবজেক্টের সাথে কাজ করে। উদাহরণস্বরূপ, JPQL একটি User Entity এর উপর কুয়েরি করবে, যা একটি টেবিলের পরিবর্তে একটি Java অবজেক্ট।
  2. Entites এবং Fields এর সাথে কাজ: JPQL এ কুয়েরি চালানোর সময় আপনি Entity এবং তার fields এর উপর কাজ করবেন, টেবিলের নাম এবং কলামগুলির পরিবর্তে।
  3. Dynamic Queries: JPQL ব্যবহার করে আপনি ডাইনামিক কুয়েরি তৈরি করতে পারেন, যা রানটাইমে পরিবর্তিত হতে পারে।
  4. Support for Aggregate Functions: JPQL সাপোর্ট করে COUNT, AVG, SUM, MIN, MAX এর মতো অ্যাগ্রিগেট ফাংশনগুলি, যেগুলি ডেটাবেসের মধ্যে অঙ্কের হিসাব করতে সাহায্য করে।
  5. Cross-Platform: JPQL এর মাধ্যমে ডেটাবেস নিরপেক্ষ কুয়েরি লেখা হয়, যা SQL এর পরিবর্তে ডেটাবেসের প্রতি নির্ভরশীলতা কমিয়ে আনে। ফলে, এটি ডেটাবেস অ্যাবস্ট্রাকশনের জন্য একটি ভালো সমাধান।

JPQL এর কুয়েরি উদাহরণ


1. SELECT Query

JPQL এর মাধ্যমে আপনি একটি Entity এর রেকর্ড থেকে তথ্য নির্বাচন করতে পারেন।

TypedQuery<User> query = entityManager.createQuery("SELECT u FROM User u WHERE u.age > 25", User.class);
List<User> users = query.getResultList();

এখানে:

  • "SELECT u FROM User u WHERE u.age > 25" হল JPQL কুয়েরি যা User Entity থেকে age এর মান ২৫ এর বেশি এমন ব্যবহারকারীদের তথ্য নিয়ে আসবে।
  • u এখানে User Entity এর জন্য এ্যালিয়াস, যা ডেটা নির্বাচন করার জন্য ব্যবহার করা হয়েছে।

2. Aggregate Functions

JPQL সাপোর্ট করে অ্যাগ্রিগেট ফাংশন, যেমন COUNT, SUM, AVG ইত্যাদি।

TypedQuery<Long> query = entityManager.createQuery("SELECT COUNT(u) FROM User u WHERE u.age > 25", Long.class);
Long userCount = query.getSingleResult();

এখানে, COUNT ফাংশন ব্যবহার করে age > 25 এমন ব্যবহারকারীদের সংখ্যা গোনা হচ্ছে।

3. UPDATE Query

JPQL এ UPDATE কুয়েরি ব্যবহার করে Entity ডেটা আপডেট করা যায়।

TypedQuery<User> query = entityManager.createQuery("UPDATE User u SET u.age = :age WHERE u.name = :name");
query.setParameter("age", 30);
query.setParameter("name", "John Doe");
int updatedCount = query.executeUpdate();

এখানে, User Entity এর age ফিল্ডের মান 30 এ আপডেট করা হচ্ছে, যেখানে name ফিল্ডের মান "John Doe"

4. DELETE Query

JPQL এর মাধ্যমে Entity রেকর্ড ডিলিট করা সম্ভব।

TypedQuery<User> query = entityManager.createQuery("DELETE FROM User u WHERE u.age < 18");
int deletedCount = query.executeUpdate();

এখানে, age < 18 এমন সকল User Entity রেকর্ড ডিলিট করা হচ্ছে।

5. JOIN Query

JPQL তে Entity গুলোর মধ্যে সম্পর্ক (relationship) তৈরি করে JOIN অপারেশন করা যায়।

TypedQuery<Object[]> query = entityManager.createQuery(
    "SELECT u.name, o.product FROM User u JOIN u.orders o WHERE u.age > 25", Object[].class);
List<Object[]> results = query.getResultList();

এখানে, User Entity এবং Order Entity এর মধ্যে সম্পর্কের মাধ্যমে JOIN করা হয়েছে। User এবং Order এর ডেটা একসাথে নিয়ে আসা হচ্ছে।


JPQL এর সীমাবদ্ধতা


  1. Complex Queries: JPQL কিছু সিম্পল কুয়েরির জন্য বেশ কার্যকরী হলেও, অনেক সময় জটিল SQL কুয়েরি লিখতে JPQL এর সীমাবদ্ধতা থাকতে পারে।
  2. No Direct Support for Functions: কিছু SQL ফাংশন JPQL এ সরাসরি সাপোর্ট করা হয় না, যেমন LIMIT (যা কিছু ডেটাবেসে পৃষ্ঠিকৃত ডেটা নিয়ে আসতে ব্যবহৃত হয়)।
  3. Less Flexibility: JPQL SQL-এর তুলনায় কম নমনীয়, কারণ এটি Entity ও তাদের ফিল্ডগুলির উপর নির্ভরশীল এবং টেবিল স্তরের ফাংশন এবং কনসেপ্টের জন্য একটু সীমাবদ্ধ।

সার্বিক পর্যালোচনা


JPQL (Java Persistence Query Language) হল JPA এর একটি গুরুত্বপূর্ণ উপাদান যা Java অবজেক্টে কুয়েরি চালানোর জন্য ব্যবহৃত হয়। এটি SQL এর মতো দেখতে হলেও, JPQL ডেটাবেসের টেবিলের পরিবর্তে Java Entities এর সাথে কাজ করে, যা ORM (Object-Relational Mapping) সমাধান ব্যবহারে গুরুত্বপূর্ণ ভূমিকা পালন করে। JPQL ডেটাবেসের মধ্যে কুয়েরি চালানোর জন্য সহজ এবং শক্তিশালী একটি ভাষা, যা ডেটা ম্যানিপুলেশন সহজ করে তোলে এবং Java ডেভেলপমেন্টে আরও কার্যকরী হয়।

Content added By

Simple JPQL Query তৈরি করা

73
73

JPQL (Java Persistence Query Language) হল JPA-এর জন্য একটি কুয়েরি ভাষা যা ডেটাবেস টেবিলের পরিবর্তে Java Entity ক্লাসের উপর কাজ করে। JPQL SQL-এর মতো, তবে এটি SQL কুয়েরি ভাষার পরিবর্তে Java অবজেক্টের সাথে কাজ করে। JPQL এর মাধ্যমে ডেটাবেস থেকে Entity অবজেক্টগুলি রিট্রিভ, আপডেট, ডিলিট এবং ইনসার্ট করা যায়।

JPQL Query এর মৌলিক গঠন


JPQL কুয়েরির গঠন SQL-এর মতো হলেও, এটি ডেটাবেস টেবিলের পরিবর্তে Entity ক্লাস এবং তাদের ফিল্ডের সাথে কাজ করে। একটি সাধারণ JPQL কুয়েরি দেখতে এভাবে হয়:

SELECT e FROM EntityClass e WHERE e.fieldName = :parameter

এখানে:

  • SELECT: এই অংশে আপনি যেসব ফিল্ড বা ডেটা চাইছেন, তা নির্বাচন করবেন।
  • FROM: এটি Entity ক্লাসকে নির্দেশ করে যা ডেটাবেস টেবিলের প্রতিনিধিত্ব করে।
  • WHERE: কন্ডিশন ব্যবহার করে রেকর্ডের ফিল্টার করা হয়।

উদাহরণ: Simple JPQL Query

ধরা যাক, আমাদের একটি Employee Entity ক্লাস রয়েছে এবং আমরা এর উপর একটি সহজ JPQL কুয়েরি তৈরি করতে চাই।

Employee Entity ক্লাস:

import javax.persistence.*;

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

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

    private String name;
    private double salary;

    // Getters and Setters
}

এখন, আমরা Employee Entity ক্লাস ব্যবহার করে কিছু JPQL কুয়েরি তৈরি করব।

1. সব Employee রেকর্ড পাওয়া (Select All Employees)

String jpql = "SELECT e FROM Employee e";
Query query = entityManager.createQuery(jpql);
List<Employee> employees = query.getResultList();

এখানে, SELECT e দ্বারা আমরা Employee Entity ক্লাসের সব অবজেক্টের তথ্য পাচ্ছি। e হল Employee Entity ক্লাসের একটি অ্যালিয়াস।

2. একটি নির্দিষ্ট Employee নির্বাচন করা (Select Employee by Name)

String jpql = "SELECT e FROM Employee e WHERE e.name = :name";
Query query = entityManager.createQuery(jpql);
query.setParameter("name", "John Doe"); // Parameter binding
Employee employee = (Employee) query.getSingleResult();

এখানে, আমরা WHERE e.name = :name কন্ডিশন ব্যবহার করছি, যেখানে :name একটি প্যারামিটার। এই প্যারামিটারটি পরে query.setParameter() দিয়ে সেট করা হয়েছে।

3. Salary এর উপর ভিত্তি করে Employees নির্বাচন করা (Employees with salary greater than a value)

String jpql = "SELECT e FROM Employee e WHERE e.salary > :salary";
Query query = entityManager.createQuery(jpql);
query.setParameter("salary", 50000); // Employees with salary greater than 50000
List<Employee> employees = query.getResultList();

এখানে, WHERE e.salary > :salary কন্ডিশন দ্বারা আমরা salary ফিল্ডের মানের উপর ভিত্তি করে Employee নির্বাচন করছি।

4. অর্ডার অনুযায়ী Employees নির্বাচন করা (Select Employees Ordered by Salary)

String jpql = "SELECT e FROM Employee e ORDER BY e.salary DESC";
Query query = entityManager.createQuery(jpql);
List<Employee> employees = query.getResultList();

এখানে, ORDER BY e.salary DESC ব্যবহার করে আমরা salary ফিল্ডের ভিত্তিতে Employees কে নাম্বার অর্ডারে (descending) সাজাচ্ছি।

5. গ্রুপিং এবং অ্যাগ্রিগেট ফাংশন ব্যবহার করা (Using GROUP BY and Aggregate functions)

String jpql = "SELECT e.department, AVG(e.salary) FROM Employee e GROUP BY e.department";
Query query = entityManager.createQuery(jpql);
List<Object[]> results = query.getResultList();

for(Object[] result : results) {
    String department = (String) result[0];
    Double avgSalary = (Double) result[1];
    System.out.println("Department: " + department + ", Average Salary: " + avgSalary);
}

এখানে, আমরা AVG(e.salary) ফাংশন ব্যবহার করে প্রতিটি বিভাগে (department) গড় বেতন বের করছি এবং GROUP BY e.department দিয়ে বিভাগের ভিত্তিতে গ্রুপিং করছি।


JPQL Query Execution


  1. createQuery: JPQL কুয়েরি তৈরি করার জন্য EntityManager এর createQuery মেথড ব্যবহার করা হয়।
  2. setParameter: যদি কুয়েরিতে প্যারামিটার ব্যবহার করা হয়, তবে setParameter মেথড দিয়ে প্যারামিটার সেট করা হয়।
  3. getResultList: কুয়েরির রেজাল্ট একটি List আকারে পাওয়া যায়।
  4. getSingleResult: যদি একক রেকর্ড রিটার্ন করতে চান, তবে getSingleResult মেথড ব্যবহার করা হয়।

সারাংশ


JPQL (Java Persistence Query Language) হল একটি শক্তিশালী কুয়েরি ভাষা যা Java Entity ক্লাসের উপর কাজ করে এবং ডেটাবেস থেকে ডেটা নির্বাচন করতে ব্যবহৃত হয়। JPQL কুয়েরির মাধ্যমে আপনি ডেটাবেস টেবিলের পরিবর্তে Java অবজেক্টগুলি রিট্রিভ, আপডেট, ডিলিট বা কুয়েরি করতে পারেন। এটি SQL-এর মত হলেও, এটি Java Entity ক্লাসের সঙ্গে কাজ করে এবং SQL ডেটাবেস টেবিলের পরিবর্তে অবজেক্টের উপর কাজ করে। JPA এবং JPQL এর সাহায্যে ডেটাবেস ইন্টারঅ্যাকশন আরও সহজ এবং অভ্যস্ত হয়।

Content added By

Named Queries এবং Dynamic Queries

107
107

JPA (Java Persistence API) ডেটাবেসের সাথে ইন্টারঅ্যাক্ট করার জন্য ব্যবহার করা একটি শক্তিশালী প্রযুক্তি। এর মাধ্যমে আপনি queries তৈরি করে ডেটাবেসে ডেটা অনুসন্ধান করতে পারেন। JPA-তে দুটি ধরনের কুয়েরি ব্যবহার করা হয়: Named Queries এবং Dynamic Queries

এগুলির মধ্যে পার্থক্য এবং ব্যবহার বিস্তারিতভাবে এখানে আলোচনা করা হবে।

Named Queries


Named Queries হল JPQL (Java Persistence Query Language) কুয়েরি যা JPA Entity ক্লাসের সাথে সংজ্ঞায়িত করা হয় এবং একটি নাম দিয়ে পুনঃব্যবহারযোগ্য করে তোলা হয়। এই ধরনের কুয়েরি কমপাইল টাইমে নির্ধারিত থাকে এবং এগুলির নামের মাধ্যমে সেগুলি সার্চ করা হয়।

Named Queries সাধারণত Entity ক্লাসের মধ্যে @Query বা @NamedQuery অ্যানোটেশন ব্যবহার করে ডিফাইন করা হয়।

Named Queries ব্যবহারের সুবিধা:

  • পুনঃব্যবহারযোগ্যতা: একই কুয়েরি একাধিক জায়গায় ব্যবহার করা যায়।
  • পারফরম্যান্স: Named Queries অনেক বেশি কার্যকরী, কারণ এগুলি Entity Manager দ্বারা কম্পাইল টাইমে পার্স করা হয়।
  • সাবধানতা: কুয়েরি নামের মাধ্যমে ক্লায়েন্ট বা ডেভেলপার নির্দিষ্ট কুয়েরি অ্যাক্সেস করতে পারেন, যা ডেটাবেস কোডের নিরাপত্তা এবং রক্ষণাবেক্ষণ সহজ করে।

Named Query এর উদাহরণ:

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

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

    // Getter and Setter methods
}

এখানে, User.findByName নামে একটি Named Query তৈরি করা হয়েছে যা ব্যবহারকারীর নাম অনুসারে ডেটা ফেরত দেবে।

Named Query ব্যবহার করার উদাহরণ:

TypedQuery<User> query = entityManager.createNamedQuery("User.findByName", User.class);
query.setParameter("name", "John Doe");
List<User> users = query.getResultList();

এখানে, createNamedQuery() মেথড ব্যবহার করে Named Query User.findByName থেকে ডেটা ফেচ করা হয়েছে।


Dynamic Queries


Dynamic Queries হল কুয়েরি যা রানটাইমে তৈরি করা হয়। এগুলি সাধারণত Criteria API বা JPQL এর মাধ্যমে ডাইনামিকভাবে তৈরি করা হয়। Dynamic Queries ব্যবহার করা হয় যখন কুয়েরি টাইপ বা ফিল্টার প্যারামিটার রানটাইমে জানা যায় না এবং যেগুলি ডাটাবেসের শর্ত বা ব্যবহারকারীর ইনপুটের উপর ভিত্তি করে পরিবর্তিত হতে পারে।

Dynamic Queries এর সুবিধা:

  • অবজেক্ট-ওরিয়েন্টেড: Criteria API ব্যবহারের মাধ্যমে আপনি Java অবজেক্টের মাধ্যমে কুয়েরি তৈরি করতে পারেন, যা কোডের রিডেবিলিটি এবং মেইনটেনেন্স বৃদ্ধি করে।
  • ফ্লেক্সিবিলিটি: রানটাইমে কুয়েরির শর্ত বা প্যারামিটার পরিবর্তন করা যায়।
  • কমপ্লেক্স কুয়েরি সমাধান: যখন কমপ্লেক্স ডেটা ফিল্টারিং বা প্যারামিটার ফিল্টার করার প্রয়োজন হয়, Dynamic Queries খুবই কার্যকর।

Dynamic Query Example (JPQL)

String jpql = "SELECT u FROM User u WHERE u.age > :age AND u.city = :city";
TypedQuery<User> query = entityManager.createQuery(jpql, User.class);
query.setParameter("age", 25);
query.setParameter("city", "New York");
List<User> users = query.getResultList();

এখানে, age এবং city প্যারামিটার সহ একটি JPQL কুয়েরি রানটাইমে তৈরি করা হয়েছে এবং ক্লায়েন্টের ইনপুট অনুসারে কুয়েরি চালানো হচ্ছে।

Dynamic Query Example (Criteria API)

Criteria API একটি অবজেক্ট-ওরিয়েন্টেড কুয়েরি তৈরি করার জন্য ব্যবহৃত হয়। এটি ডাইনামিক কুয়েরি তৈরির জন্য আরও কার্যকরী এবং শক্তিশালী পদ্ধতি।

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<User> criteriaQuery = criteriaBuilder.createQuery(User.class);
Root<User> root = criteriaQuery.from(User.class);

Predicate agePredicate = criteriaBuilder.greaterThan(root.get("age"), 25);
Predicate cityPredicate = criteriaBuilder.equal(root.get("city"), "New York");

criteriaQuery.select(root).where(criteriaBuilder.and(agePredicate, cityPredicate));

TypedQuery<User> query = entityManager.createQuery(criteriaQuery);
List<User> users = query.getResultList();

এখানে, Criteria API ব্যবহার করে age এবং city এর শর্তে ডাইনামিক কুয়েরি তৈরি করা হয়েছে।


Named Queries এবং Dynamic Queries এর মধ্যে পার্থক্য

বৈশিষ্ট্যNamed QueriesDynamic Queries
ডিফাইনেশনকমপাইল টাইমে ডিফাইন করা হয় (অ্যানোটেশন বা XML এর মাধ্যমে)রানটাইমে তৈরি করা হয় (JPQL অথবা Criteria API দিয়ে)
ফ্লেক্সিবিলিটিসীমিত, কারণ কুয়েরি আগে থেকেই নির্ধারিত থাকেঅধিক, কারণ কুয়েরি শর্ত রানটাইমে পরিবর্তন করা যায়
পারফরম্যান্সঅধিক কার্যকরী, কারণ এটি আগে থেকেই কম্পাইল হয়কম কার্যকরী, কারণ কুয়েরি রানটাইমে তৈরি হয়
ব্যবহারসাধারণ এবং একাধিক জায়গায় পুনরাবৃত্তি করা যেতে পারেযখন কুয়েরির শর্ত বা ফিল্টার পরিবর্তনশীল হয়
টেমপ্লেটিংকুয়েরি স্ট্যাটিক এবং পুনঃব্যবহারযোগ্যকুয়েরি ডাইনামিক এবং পরিবর্তনশীল

সারাংশ


  • Named Queries হল পূর্বনির্ধারিত, স্ট্যাটিক কুয়েরি যা Entity ক্লাসে @NamedQuery অথবা XML ফাইলে সংজ্ঞায়িত করা হয় এবং একাধিক জায়গায় পুনঃব্যবহার করা যায়। এটি কম্পাইল টাইমে নির্ধারিত এবং ভালো পারফরম্যান্স প্রদান করে।
  • Dynamic Queries হল কুয়েরি যা রানটাইমে তৈরি হয়, বিশেষ করে যখন শর্ত বা ফিল্টার ডেটা ব্যবহারকারী ইনপুট বা অন্যান্য পরিবর্তনশীল উপাদানের উপর ভিত্তি করে পরিবর্তিত হয়। এটি বেশি ফ্লেক্সিবল, তবে এর পারফরম্যান্স কিছুটা কম হতে পারে।

JPA তে কুয়েরি ব্যবহারের জন্য Named Queries এবং Dynamic Queries উভয়ই খুব গুরুত্বপূর্ণ, এবং তাদের সুবিধা অনুযায়ী বিভিন্ন পরিস্থিতিতে ব্যবহার করা যেতে পারে।

Content added By

JPQL এর মাধ্যমে Joins এবং Aggregate Functions ব্যবহার

61
61

JPQL (Java Persistence Query Language) হল একটি অবজেক্ট-ওরিয়েন্টেড কুয়েরি ভাষা যা JPA (Java Persistence API) এর সাথে ব্যবহৃত হয়। এটি SQL এর মতো দেখতে হলেও, JPQL ডেটাবেস টেবিলের পরিবর্তে Java অবজেক্টগুলোকে লক্ষ্য করে। JPQL ব্যবহার করে জটিল কুয়েরি যেমন Joins এবং Aggregate Functions তৈরি করা সম্ভব, যা ডেটাবেসের ডেটা আর্জন ও বিশ্লেষণ করতে সাহায্য করে।

এই লেখায় আমরা JPQL এর মাধ্যমে Joins এবং Aggregate Functions ব্যবহারের পদ্ধতি আলোচনা করব।

1. JPQL এর মাধ্যমে Joins ব্যবহার


Join অপারেশন ডেটাবেসের দুটি বা তার বেশি টেবিলের মধ্যে সম্পর্ক স্থাপন করে। JPQL এ JOIN অপারেশনটি একাধিক সম্পর্কিত অবজেক্টের মধ্যে সম্পর্ক স্থাপন করতে ব্যবহৃত হয়। JPA এর সাথে Join ব্যবহারের ক্ষেত্রে, আপনি JOIN, LEFT JOIN, INNER JOIN ইত্যাদি অপশন ব্যবহার করতে পারেন।

JOIN উদাহরণ

ধরা যাক, আপনার দুটি এন্টিটি রয়েছে, Author এবং Book। এখানে Author অবজেক্টটি অনেক Book অবজেক্টে সম্পর্কিত।

Author Entity:

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

@Entity
public class Author {
    @Id
    private Long id;
    private String name;

    @OneToMany(mappedBy = "author")
    private List<Book> books;

    // Getters and Setters
}

Book Entity:

import javax.persistence.*;

@Entity
public class Book {
    @Id
    private Long id;
    private String title;

    @ManyToOne
    @JoinColumn(name = "author_id")
    private Author author;

    // Getters and Setters
}

এখন, আমরা JPQL ব্যবহার করে Author এবং Book এর মধ্যে Join করতে পারি। উদাহরণস্বরূপ, সব Book এবং তাদের Author কে ফেচ করতে:

JPQL Query with JOIN

String jpql = "SELECT b FROM Book b JOIN b.author a WHERE a.name = :authorName";
TypedQuery<Book> query = entityManager.createQuery(jpql, Book.class);
query.setParameter("authorName", "John Doe");
List<Book> books = query.getResultList();

এখানে, আমরা Book অবজেক্টের author প্রপার্টি ব্যবহার করে Author অবজেক্টের সাথে JOIN করেছি।

LEFT JOIN উদাহরণ

যদি আপনি সব Book দেখতে চান, এবং তাদের সাথে সম্পর্কিত Author না থাকলেও, তখন LEFT JOIN ব্যবহার করবেন:

String jpql = "SELECT b FROM Book b LEFT JOIN b.author a";
TypedQuery<Book> query = entityManager.createQuery(jpql, Book.class);
List<Book> books = query.getResultList();

এখানে, LEFT JOIN ব্যবহারের মাধ্যমে, এমন Book গুলি ফেচ করা হবে যেগুলির সাথে Author সম্পর্কিত নয়।


2. JPQL এর মাধ্যমে Aggregate Functions ব্যবহার


Aggregate Functions ডেটাবেসের ডেটা গ্রুপ এবং সংক্ষেপ করার জন্য ব্যবহৃত হয়। JPQL এ aggregate functions যেমন COUNT, SUM, AVG, MAX, MIN ইত্যাদি ব্যবহার করা যায়।

COUNT() Example

ধরা যাক, আমরা Author এর প্রতি কতটি Book আছে তা জানতে চাই:

String jpql = "SELECT a.name, COUNT(b) FROM Author a LEFT JOIN a.books b GROUP BY a.name";
TypedQuery<Object[]> query = entityManager.createQuery(jpql, Object[].class);
List<Object[]> results = query.getResultList();
for (Object[] result : results) {
    System.out.println("Author: " + result[0] + ", Number of Books: " + result[1]);
}

এখানে, COUNT(b) ব্যবহার করা হয়েছে যা প্রতিটি Author এর সাথে সম্পর্কিত Book গুলির সংখ্যা গণনা করে।

SUM() Example

ধরা যাক, আপনার Book এ একটি price ফিল্ড আছে, এবং আপনি জানতে চান একটি Author এর সমস্ত Book এর মোট মূল্য:

String jpql = "SELECT a.name, SUM(b.price) FROM Author a JOIN a.books b GROUP BY a.name";
TypedQuery<Object[]> query = entityManager.createQuery(jpql, Object[].class);
List<Object[]> results = query.getResultList();
for (Object[] result : results) {
    System.out.println("Author: " + result[0] + ", Total Price: " + result[1]);
}

এখানে, SUM(b.price) ব্যবহার করে আমরা প্রতিটি Author এর সাথে সম্পর্কিত Book এর মূল্য যোগফল হিসেব করেছি।

AVG() Example

যদি আপনি কোনো Book এর গড় মূল্য বের করতে চান:

String jpql = "SELECT AVG(b.price) FROM Book b";
TypedQuery<Double> query = entityManager.createQuery(jpql, Double.class);
Double averagePrice = query.getSingleResult();
System.out.println("Average Price: " + averagePrice);

এখানে, AVG(b.price) ব্যবহার করা হয়েছে যা সব Book এর গড় মূল্য প্রদান করবে।

MAX() এবং MIN() Example

যদি আপনি Book এর সর্বোচ্চ বা সর্বনিম্ন মূল্য জানতে চান:

String jpqlMax = "SELECT MAX(b.price) FROM Book b";
TypedQuery<Double> queryMax = entityManager.createQuery(jpqlMax, Double.class);
Double maxPrice = queryMax.getSingleResult();
System.out.println("Max Price: " + maxPrice);

String jpqlMin = "SELECT MIN(b.price) FROM Book b";
TypedQuery<Double> queryMin = entityManager.createQuery(jpqlMin, Double.class);
Double minPrice = queryMin.getSingleResult();
System.out.println("Min Price: " + minPrice);

এখানে, MAX(b.price) এবং MIN(b.price) ব্যবহার করে যথাক্রমে সর্বোচ্চ এবং সর্বনিম্ন মূল্য বের করা হয়েছে।


JPQL এর মাধ্যমে Joins এবং Aggregate Functions এর সুবিধা


  1. ডেটা সম্পর্কের মধ্যে সংযোগ স্থাপন: JOIN ব্যবহার করে সম্পর্কিত অবজেক্টগুলোকে একত্রিত করা সহজ হয়, যা ডেটাবেসের মধ্যে সম্পর্কিত টেবিলগুলির মধ্যে সংযোগ তৈরি করে।
  2. জটিল কুয়েরি সমাধান: Aggregate Functions ব্যবহার করে ডেটাবেসের মধ্যে জটিল গাণিতিক অপারেশন করা যায়, যেমন গড়, সর্বোচ্চ/সর্বনিম্ন মান, যোগফল ইত্যাদি।
  3. অপ্টিমাইজড কোড: JPQL এর মাধ্যমে সিম্পল এবং অবজেক্ট-ওরিয়েন্টেড কুয়েরি লেখা সম্ভব হয়, যা SQL কোডের তুলনায় আরও রিডেবল এবং স্কেলেবল।
  4. ডেটাবেসের উপর নির্ভরশীলতা কমানো: JPQL ব্যবহার করে SQL কোডের চেয়ে Java অবজেক্টের সাথে কাজ করা সহজ হয়, এবং এটি ডেটাবেস নিরপেক্ষভাবে কাজ করতে সাহায্য করে।

সারাংশ


JPQL (Java Persistence Query Language) জাভা ডেভেলপারদের জন্য শক্তিশালী একটি কুয়েরি ভাষা যা ডেটাবেসের ডেটা অবজেক্ট হিসেবে এক্সেস করার সুবিধা দেয়। Joins এবং Aggregate Functions JPQL এ ব্যবহারের মাধ্যমে ডেটাবেস থেকে সম্পর্কিত ডেটা একত্রিত করা এবং ডেটার উপর গাণিতিক অপারেশন করা সহজ হয়ে যায়। JOIN এবং Aggregate Functions এর সাহায্যে ডেটার বিশ্লেষণ এবং রিট্রিভাল আরো কার্যকরী ও স্কেলেবল হয়।

Content added By
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion