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 কুয়েরির মূল গঠন SQL কুয়েরির মতোই, তবে এটি অবজেক্ট ও প্রপার্টি ভিত্তিক। মূল বৈশিষ্ট্যগুলো হল:
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 u
– User
Entity ক্লাস থেকে ডেটা রিটার্ন করা হচ্ছে।WHERE u.age > 25
– যেখানে age
ফিল্ড ২৫ এর বেশি, সেগুলিকে রিটার্ন করা হবে।String jpql = "SELECT COUNT(u) FROM User u";
TypedQuery<Long> query = entityManager.createQuery(jpql, Long.class);
Long count = query.getSingleResult();
এখানে:
User
Entity এর রেকর্ডের মোট সংখ্যা ফেরত দেবে।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();
এখানে:
User
Entity এর নামের উপর ভিত্তি করে ASCENDING অর্ডারে রেকর্ডগুলি রিটার্ন করা হবে।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();
এখানে:
JPQL তে JOIN ব্যবহার করে একাধিক Entity এর মধ্যে সম্পর্ক স্থাপন করা হয়। যেমন, OneToMany
, ManyToOne
বা ManyToMany
রিলেশনশিপে থাকা ডেটার জন্য JOIN কুয়েরি ব্যবহার করা যায়।
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();
এখানে:
Order
Entity এবং User
Entity এর মধ্যে একটি INNER JOIN করা হয়েছে, যেখানে Order
Entity এর user
প্রপার্টির সাথে User
Entity যুক্ত হয়েছে।User
Entity এর নামের ভিত্তিতে ফিল্টার করা হয়েছে।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();
এখানে:
Order
Entity এর সাথে User
Entity যুক্ত হয়েছে, তবে User
Entity না থাকলেও Order
Entity রিটার্ন হবে।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();
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();
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 এর মাধ্যমে:
JPQL ডেটাবেস অপারেশনগুলোকে কার্যকরী এবং সহজভাবে ম্যানেজ করার একটি উপায় প্রদান করে, যা Java অ্যাপ্লিকেশনগুলির পারফরম্যান্স এবং রক্ষণাবেক্ষণ সহজ করে তোলে।
JPQL (Java Persistence Query Language) হল একটি স্ট্যান্ডার্ড কুয়েরি ভাষা যা JPA (Java Persistence API) এর মধ্যে ব্যবহৃত হয়। এটি একটি অবজেক্ট-ওরিয়েন্টেড কুয়েরি ভাষা যা ডেটাবেস টেবিলের উপর নয়, বরং Java অবজেক্ট এর উপর কাজ করে। JPQL এর মাধ্যমে আপনি Entity গুলির উপর কুয়েরি চালাতে পারেন, যা JPA Entity গুলোর ডেটাকে রিলেশনাল ডেটাবেস থেকে সংগ্রহ করতে সহায়তা করে। এটি SQL এর মতোই দেখতে, কিন্তু এটি Java অবজেক্ট এবং তাদের প্রপার্টির সাথে কাজ করে।
JPQL (Java Persistence Query Language) এর ভূমিকা হল Java অবজেক্টগুলির উপর ভিত্তি করে ডেটাবেস থেকে ডেটা খোঁজা। এটি ডেটাবেসে SQL কুয়েরি পাঠানোর পরিবর্তে JPA Entity গুলির উপর কুয়েরি পরিচালনা করে, যার ফলে ডেটাবেস এবং Java অবজেক্টের মধ্যে সম্পর্ক খুব সহজভাবে ম্যানেজ করা যায়।
JPQL এর মাধ্যমে আপনি SELECT, UPDATE, DELETE, INSERT ইত্যাদি SQL অপারেশন করতে পারেন, তবে এটি Java অবজেক্টগুলির ওপর ভিত্তি করে কাজ করবে।
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 এর জন্য এ্যালিয়াস, যা ডেটা নির্বাচন করার জন্য ব্যবহার করা হয়েছে।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 এমন ব্যবহারকারীদের সংখ্যা গোনা হচ্ছে।
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"
।
JPQL এর মাধ্যমে Entity রেকর্ড ডিলিট করা সম্ভব।
TypedQuery<User> query = entityManager.createQuery("DELETE FROM User u WHERE u.age < 18");
int deletedCount = query.executeUpdate();
এখানে, age < 18 এমন সকল User Entity রেকর্ড ডিলিট করা হচ্ছে।
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 (Java Persistence Query Language) হল JPA এর একটি গুরুত্বপূর্ণ উপাদান যা Java অবজেক্টে কুয়েরি চালানোর জন্য ব্যবহৃত হয়। এটি SQL এর মতো দেখতে হলেও, JPQL ডেটাবেসের টেবিলের পরিবর্তে Java Entities এর সাথে কাজ করে, যা ORM (Object-Relational Mapping) সমাধান ব্যবহারে গুরুত্বপূর্ণ ভূমিকা পালন করে। JPQL ডেটাবেসের মধ্যে কুয়েরি চালানোর জন্য সহজ এবং শক্তিশালী একটি ভাষা, যা ডেটা ম্যানিপুলেশন সহজ করে তোলে এবং Java ডেভেলপমেন্টে আরও কার্যকরী হয়।
JPQL (Java Persistence Query Language) হল JPA-এর জন্য একটি কুয়েরি ভাষা যা ডেটাবেস টেবিলের পরিবর্তে Java Entity ক্লাসের উপর কাজ করে। JPQL SQL-এর মতো, তবে এটি SQL কুয়েরি ভাষার পরিবর্তে Java অবজেক্টের সাথে কাজ করে। JPQL এর মাধ্যমে ডেটাবেস থেকে Entity অবজেক্টগুলি রিট্রিভ, আপডেট, ডিলিট এবং ইনসার্ট করা যায়।
JPQL কুয়েরির গঠন SQL-এর মতো হলেও, এটি ডেটাবেস টেবিলের পরিবর্তে Entity ক্লাস এবং তাদের ফিল্ডের সাথে কাজ করে। একটি সাধারণ JPQL কুয়েরি দেখতে এভাবে হয়:
SELECT e FROM EntityClass e WHERE e.fieldName = :parameter
এখানে:
ধরা যাক, আমাদের একটি 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 কুয়েরি তৈরি করব।
String jpql = "SELECT e FROM Employee e";
Query query = entityManager.createQuery(jpql);
List<Employee> employees = query.getResultList();
এখানে, SELECT e
দ্বারা আমরা Employee
Entity ক্লাসের সব অবজেক্টের তথ্য পাচ্ছি। e
হল Employee
Entity ক্লাসের একটি অ্যালিয়াস।
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()
দিয়ে সেট করা হয়েছে।
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 নির্বাচন করছি।
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) সাজাচ্ছি।
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
দিয়ে বিভাগের ভিত্তিতে গ্রুপিং করছি।
createQuery
: JPQL কুয়েরি তৈরি করার জন্য EntityManager
এর createQuery
মেথড ব্যবহার করা হয়।setParameter
: যদি কুয়েরিতে প্যারামিটার ব্যবহার করা হয়, তবে setParameter
মেথড দিয়ে প্যারামিটার সেট করা হয়।getResultList
: কুয়েরির রেজাল্ট একটি List আকারে পাওয়া যায়।getSingleResult
: যদি একক রেকর্ড রিটার্ন করতে চান, তবে getSingleResult
মেথড ব্যবহার করা হয়।JPQL (Java Persistence Query Language) হল একটি শক্তিশালী কুয়েরি ভাষা যা Java Entity ক্লাসের উপর কাজ করে এবং ডেটাবেস থেকে ডেটা নির্বাচন করতে ব্যবহৃত হয়। JPQL কুয়েরির মাধ্যমে আপনি ডেটাবেস টেবিলের পরিবর্তে Java অবজেক্টগুলি রিট্রিভ, আপডেট, ডিলিট বা কুয়েরি করতে পারেন। এটি SQL-এর মত হলেও, এটি Java Entity ক্লাসের সঙ্গে কাজ করে এবং SQL ডেটাবেস টেবিলের পরিবর্তে অবজেক্টের উপর কাজ করে। JPA এবং JPQL এর সাহায্যে ডেটাবেস ইন্টারঅ্যাকশন আরও সহজ এবং অভ্যস্ত হয়।
JPA (Java Persistence API) ডেটাবেসের সাথে ইন্টারঅ্যাক্ট করার জন্য ব্যবহার করা একটি শক্তিশালী প্রযুক্তি। এর মাধ্যমে আপনি queries তৈরি করে ডেটাবেসে ডেটা অনুসন্ধান করতে পারেন। JPA-তে দুটি ধরনের কুয়েরি ব্যবহার করা হয়: Named Queries এবং Dynamic Queries।
এগুলির মধ্যে পার্থক্য এবং ব্যবহার বিস্তারিতভাবে এখানে আলোচনা করা হবে।
Named Queries হল JPQL (Java Persistence Query Language) কুয়েরি যা JPA Entity ক্লাসের সাথে সংজ্ঞায়িত করা হয় এবং একটি নাম দিয়ে পুনঃব্যবহারযোগ্য করে তোলা হয়। এই ধরনের কুয়েরি কমপাইল টাইমে নির্ধারিত থাকে এবং এগুলির নামের মাধ্যমে সেগুলি সার্চ করা হয়।
Named Queries সাধারণত Entity ক্লাসের মধ্যে @Query
বা @NamedQuery
অ্যানোটেশন ব্যবহার করে ডিফাইন করা হয়।
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 তৈরি করা হয়েছে যা ব্যবহারকারীর নাম অনুসারে ডেটা ফেরত দেবে।
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 হল কুয়েরি যা রানটাইমে তৈরি করা হয়। এগুলি সাধারণত Criteria API বা JPQL এর মাধ্যমে ডাইনামিকভাবে তৈরি করা হয়। Dynamic Queries ব্যবহার করা হয় যখন কুয়েরি টাইপ বা ফিল্টার প্যারামিটার রানটাইমে জানা যায় না এবং যেগুলি ডাটাবেসের শর্ত বা ব্যবহারকারীর ইনপুটের উপর ভিত্তি করে পরিবর্তিত হতে পারে।
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 কুয়েরি রানটাইমে তৈরি করা হয়েছে এবং ক্লায়েন্টের ইনপুট অনুসারে কুয়েরি চালানো হচ্ছে।
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 |
---|---|---|
ডিফাইনেশন | কমপাইল টাইমে ডিফাইন করা হয় (অ্যানোটেশন বা XML এর মাধ্যমে) | রানটাইমে তৈরি করা হয় (JPQL অথবা Criteria API দিয়ে) |
ফ্লেক্সিবিলিটি | সীমিত, কারণ কুয়েরি আগে থেকেই নির্ধারিত থাকে | অধিক, কারণ কুয়েরি শর্ত রানটাইমে পরিবর্তন করা যায় |
পারফরম্যান্স | অধিক কার্যকরী, কারণ এটি আগে থেকেই কম্পাইল হয় | কম কার্যকরী, কারণ কুয়েরি রানটাইমে তৈরি হয় |
ব্যবহার | সাধারণ এবং একাধিক জায়গায় পুনরাবৃত্তি করা যেতে পারে | যখন কুয়েরির শর্ত বা ফিল্টার পরিবর্তনশীল হয় |
টেমপ্লেটিং | কুয়েরি স্ট্যাটিক এবং পুনঃব্যবহারযোগ্য | কুয়েরি ডাইনামিক এবং পরিবর্তনশীল |
@NamedQuery
অথবা XML ফাইলে সংজ্ঞায়িত করা হয় এবং একাধিক জায়গায় পুনঃব্যবহার করা যায়। এটি কম্পাইল টাইমে নির্ধারিত এবং ভালো পারফরম্যান্স প্রদান করে।JPA তে কুয়েরি ব্যবহারের জন্য Named Queries এবং Dynamic Queries উভয়ই খুব গুরুত্বপূর্ণ, এবং তাদের সুবিধা অনুযায়ী বিভিন্ন পরিস্থিতিতে ব্যবহার করা যেতে পারে।
JPQL (Java Persistence Query Language) হল একটি অবজেক্ট-ওরিয়েন্টেড কুয়েরি ভাষা যা JPA (Java Persistence API) এর সাথে ব্যবহৃত হয়। এটি SQL এর মতো দেখতে হলেও, JPQL ডেটাবেস টেবিলের পরিবর্তে Java অবজেক্টগুলোকে লক্ষ্য করে। JPQL ব্যবহার করে জটিল কুয়েরি যেমন Joins এবং Aggregate Functions তৈরি করা সম্ভব, যা ডেটাবেসের ডেটা আর্জন ও বিশ্লেষণ করতে সাহায্য করে।
এই লেখায় আমরা JPQL এর মাধ্যমে Joins এবং Aggregate Functions ব্যবহারের পদ্ধতি আলোচনা করব।
Join অপারেশন ডেটাবেসের দুটি বা তার বেশি টেবিলের মধ্যে সম্পর্ক স্থাপন করে। JPQL এ JOIN অপারেশনটি একাধিক সম্পর্কিত অবজেক্টের মধ্যে সম্পর্ক স্থাপন করতে ব্যবহৃত হয়। JPA এর সাথে Join ব্যবহারের ক্ষেত্রে, আপনি JOIN
, LEFT JOIN
, INNER 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 কে ফেচ করতে:
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 করেছি।
যদি আপনি সব 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 সম্পর্কিত নয়।
Aggregate Functions ডেটাবেসের ডেটা গ্রুপ এবং সংক্ষেপ করার জন্য ব্যবহৃত হয়। JPQL এ aggregate functions যেমন COUNT
, SUM
, AVG
, MAX
, MIN
ইত্যাদি ব্যবহার করা যায়।
ধরা যাক, আমরা 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 গুলির সংখ্যা গণনা করে।
ধরা যাক, আপনার 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 এর মূল্য যোগফল হিসেব করেছি।
যদি আপনি কোনো 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 এর গড় মূল্য প্রদান করবে।
যদি আপনি 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 (Java Persistence Query Language) জাভা ডেভেলপারদের জন্য শক্তিশালী একটি কুয়েরি ভাষা যা ডেটাবেসের ডেটা অবজেক্ট হিসেবে এক্সেস করার সুবিধা দেয়। Joins এবং Aggregate Functions JPQL এ ব্যবহারের মাধ্যমে ডেটাবেস থেকে সম্পর্কিত ডেটা একত্রিত করা এবং ডেটার উপর গাণিতিক অপারেশন করা সহজ হয়ে যায়। JOIN এবং Aggregate Functions এর সাহায্যে ডেটার বিশ্লেষণ এবং রিট্রিভাল আরো কার্যকরী ও স্কেলেবল হয়।
Read more