1.1 HQL এর ভূমিকা

পূর্বে, আপনি হাইবারনেটের সাথে পরিচিত হয়েছেন, এবং এখন আমি আপনাকে HQL , ওরফে হাইবারনেট কোয়েরি ল্যাঙ্গুয়েজ এর সাথে পরিচয় করিয়ে দেব । আসলে, হাইবারনেটে প্রশ্ন লেখার জন্য এটি এসকিউএল রূপান্তরিত। এটির বেশ কয়েকটি মূল পার্থক্য রয়েছে।

  1. টেবিলের নামের পরিবর্তে ক্লাসের নাম ব্যবহার করা ।
  2. টেবিল কলাম নামের পরিবর্তে ক্লাস ক্ষেত্রের নাম ব্যবহার করে ।
  3. নির্বাচনের ঐচ্ছিক ব্যবহার.

আসুন হাইবারনেটকে ডাটাবেসে থাকা সমস্ত ব্যবহারকারীকে আমাদের কাছে ফেরত দিতে বলি। এই অনুরোধটি দেখতে কেমন হবে:

from User

এতটুকুই, তুলনা করার জন্য, আমরা এসকিউএল-এ একটি অনুরূপ প্রশ্ন উপস্থাপন করি:

select * from user

এখানে Userক্লাসের নাম, এবং userটেবিলের নাম।

সম্পূর্ণ জাভা কোড এই মত দেখাবে:


public List<User> getAllUsers() {
    try (Session session = sessionFactory.openSession()) {
            return session.createQuery("from User", User.class).list();
    }
}

অন্যথায়, HQL খুব SQL এর অনুরূপ - এটিতে অপারেটরও রয়েছে:

  • WHERE
  • ORDER BY
  • GROUP BY
  • HAVING

1.2 HQL এর সাথে কাজ করার উদাহরণ

সম্ভবত আগের উদাহরণটি একই টেবিল এবং ক্ষেত্রের নামের কারণে কিছুটা বিভ্রান্তিকর। আসুন একটি বিশেষ উদাহরণ নিয়ে আসা যাক যেখানে এটি সহজ হবে।

ধরা যাক আমাদের একটি user_data টেবিল রয়েছে যাতে নিম্নলিখিত ক্ষেত্রগুলি রয়েছে:

  • আইডি আইএনটি
  • ব্যবহারকারীর নাম VARCHAR(100)
  • user_level INT
  • user_created DATE

আমরা একটি জাভা ক্লাস তৈরি করব যা এই টেবিলে ম্যাপ করবে:


@Entity
@Table(name="user_data")
class User {
   @Id
   @GeneratedValue
   public Integer id;
 
   @Column(name="user_name")
   public String name;
 
   @Column(name="user_level")
   public Integer level;
 
   @Column(name="user_created")
   public Date created;
}

এখন কিছু উদাহরণ লিখি:

HQL এসকিউএল
ব্যবহারকারী থেকে user_data থেকে * নির্বাচন করুন
ব্যবহারকারী থেকে যেখানে id=3 user_data থেকে * নির্বাচন করুন যেখানে id=3
ব্যবহারকারীর কাছ থেকে যেখানে স্তর (10,20,30) user_data থেকে * নির্বাচন করুন যেখানে user_level IN (10, 20, 30)
তৈরি asc দ্বারা ব্যবহারকারীর আদেশ থেকে user_created asc দ্বারা user_data অর্ডার থেকে * নির্বাচন করুন
ব্যবহারকারীর থেকে যেখানে নাম 'পরীক্ষা' user_data থেকে * নির্বাচন করুন যেখানে user_name like 'test'

ক্যোয়ারীগুলি খুব একই রকম, এবং যখন আপনি ক্লাসের নাম এবং তাদের ক্ষেত্রগুলির সাথে পরিচিত হন তখন HQL প্রশ্নগুলি পড়া SQL কোয়েরি পড়ার মতোই সহজ। এটি লিখতে একটু বেশি কঠিন হতে পারে, কিন্তু তারপর আবার, খুব জটিল প্রশ্নগুলি খুব কমই HQL এ লেখা হয়।

1.3 নির্বাচন ব্যবহার করে

HQL-এ, আপনি ব্যবহার করতে পারেন selectযখন ফলাফলের ডেটা টাইপ তে উল্লেখিত টাইপের সাথে মেলে না from

উদাহরণস্বরূপ, আমরা আমাদের user_data টেবিলে থাকা সমস্ত ব্যবহারকারীর নাম পেতে চাই , তারপর আমাদের নিম্নলিখিত ক্যোয়ারী লিখতে হবে:

select name from User

এছাড়াও, যদি নামের মধ্যে সদৃশ থাকে, তাহলে আপনি অপারেটর ব্যবহার করতে পারেন DISTINCT:

select distinct name from User

উপনামগুলি SQL এর মতোই কাজ করে:

select distinct u.name from User u where u.created > '2020-01-01'

ঠিক আছে, সম্পূর্ণরূপে জাভা কোড আকারে, এই অনুরোধটি এরকম দেখাবে:

public List<String> getUserNames() {
    try (Session session = sessionFactory.openSession()) {
            String hql = "select distinct u.name from User u where u.created > '2020-01-01'";
            Query<String> query = session.createQuery(hql , String.class);
            return query.list();
    }
}

মনে রাখবেন যে ক্যোয়ারীটি অবশ্যই নামের একটি তালিকা প্রদান করবে। নাম টাইপ স্ট্রিং, তাই ফাংশনের ধরন এবং Query ক্লাসের টাইপ প্যারামিটার উভয়ই String টাইপ।