মানদণ্ড API এর ভূমিকা

হাইবারনেটে ডাটাবেস প্রশ্নগুলি লেখার দুটি উপায় রয়েছে:

  • হাইবারনেট কোয়েরি ভাষা
  • মানদণ্ড API

আপনি অনেক আগেই প্রথমটির সাথে দেখা করেছেন, মানদণ্ড API এর সাথে পরিচিত হওয়ার সময় এসেছে। এটি একটি খুব শক্তিশালী টুল, কিছু সময়ে এটি HQL এর চেয়েও বেশি জনপ্রিয় ছিল। এখন এটি এত জনপ্রিয় নয়, তবে কিছু কাজের জন্য এটি অবশ্যই HQL এর চেয়ে ভাল সমাধান হবে।

যাই হোক না কেন, আপনি মানদণ্ড API এর সাথে পরিচিত না হয়ে হাইবারনেট শিখতে পারবেন না। আসুন একটি ছোট উদাহরণ লিখি, এবং তারপর আমরা এটি বিশ্লেষণ করব। উদাহরণস্বরূপ, আমরা ডাটাবেস থেকে সমস্ত কর্মচারীদের (কর্মচারী) অনুরোধ করব। আমরা যা পাব তা এখানে:

CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Employee> critQuery = builder.createQuery(Employee.class);

Root<Employee> root = critQuery.from(Employee.class);
critQuery.select(root);

Query<Employee> query = session.createQuery(critQuery);
List<Employee> results = query.getResultList();

দেখতে জটিল। আসুন তুলনা করার জন্য একই HQL ক্যোয়ারী লিখি:

String hqlQuery = "from Employee";

Query<Employee> query = session.createQuery(hqlQuery);
List<Employee> results = query.getResultList();

মনে রাখবেন যে উভয় উদাহরণের শেষ দুটি লাইন প্রায় অভিন্ন: আমরা একটি Query অবজেক্ট তৈরি করি এবং একটি তালিকা পেতে এটি ব্যবহার করি। এটি ইঙ্গিত দেয় যে বাকি লাইনগুলি অভিন্ন কিছু করছে৷

প্রথম উদাহরণের 3 এবং 4 লাইন দেখুন:

Root<Employee> root = critQuery.from(Employee.class);
critQuery.select(root);

আসুন সেগুলি এক লাইনে লিখি:

critQuery.select(critQuery.from(Employee.class));

এটা কি কিছু মনে করিয়ে দেয় না? এবং যদি আপনি এটিকে একটু ভিন্নভাবে রঙ করেন:

critQuery.select(critQuery.from(Employee.class));

হ্যাঁ, এটি SELECT FROM ক্যোয়ারীটির এমন একটি জটিল নির্মাণ।

মানদণ্ড API এর সাথে কাজ করার উদাহরণ

একটি ভাল বোঝার জন্য, আমি শুধু কয়েক উদাহরণ দিতে হবে.

অনুরোধ 1 . 10 হাজারের উপরে বেতন সহ সমস্ত কর্মচারী পান:

critQuery.select(critQuery.from(Employee.class)).where(builder.gt(root.get("salary"), 10000));

অনুরোধ 2 । 50 হাজারের কম বেতনের সমস্ত কর্মচারী পান:

critQuery.select(critQuery.from(Employee.class)).where(builder.lt(root.get("salary"), 50000));

অনুরোধ 3 . সমস্ত কর্মচারী পান যাদের কাজের শিরোনামে "পরীক্ষা" শব্দটি রয়েছে:

critQuery.select(critQuery.from(Employee.class)).where(builder.like(root.get("occupation"), "%test%"));

অনুরোধ 4 . 10 থেকে 50 হাজার বেতনে সব কর্মচারী পান:

critQuery.select(critQuery.from(Employee.class)).where(builder.between(root.get("salary"), 10000, 50000));

অনুরোধ 5 . সমস্ত কর্মচারী পান যাদের নাম শূন্য:

critQuery.select(critQuery.from(Employee.class)).where(builder.isNull(root.get("name")));

অনুরোধ 6 . সমস্ত কর্মচারী পান যাদের নাম শূন্য নয়:

critQuery.select(critQuery.from(Employee.class)).where(builder.isNotNull(root.get("name")));

এটি একটি ক্যোয়ারী তৈরি করার জন্য একটি কঠিন উপায়:

  • প্রথমে আপনি বস্তুটি পানক্রাইটেরিয়া বিল্ডার.
  • তারপর একটি বস্তু তৈরি করতে এটি ব্যবহার করুনক্রাইটেরিয়া কোয়েরি.
  • তারপর আপনি এর সাথে অংশ যোগ করা শুরু করুনক্রাইটেরিয়া কোয়েরিএবংক্রাইটেরিয়া বিল্ডার.

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

  • নির্বাচন করুন
  • থেকে
  • কোথায়

এছাড়াও ব্যবহার করেক্রাইটেরিয়া বিল্ডারআপনি WHERE এর জন্য বিভিন্ন শর্ত তৈরি করতে পারেন।

মানদণ্ড API এর সাথে উন্নত কাজ

মানদণ্ড API ব্যবহার করে, আপনি যেকোন জটিলতার একটি প্রশ্ন তৈরি করতে পারেন। এবং এই মহান খবর. উদাহরণস্বরূপ, আপনি একটি জটিল WHERE ক্লজ চান। এটি কীভাবে করবেন তা এখানে:

Predicate greaterThan = builder.gt(root.get("salary"), 1000);
Predicate testers = builder.like(root.get("occupation"), "test%");

critQuery.select(critQuery.from(Employee.class)).where(builder.or(greaterThan, testers));

আপনি যদি OR এর পরিবর্তে AND লিখতে চান তবে আপনাকে শুধুমাত্র শেষ লাইনটি পরিবর্তন করতে হবে:

critQuery.select(critQuery.from(Employee.class)).where(builder.and(greaterThan, testers));

সবকিছু আসলে খুব সহজ. আমি আপনাকে কয়েকটি তুলনা সহ একটি টেবিল দিই:

এসকিউএল পদ্ধতি সম্পূর্ণ রেকর্ড
a<b lt(a, b) builder.lt(a, b)
a > খ gt(a, b) builder.gt(a, b)
একটি বা খ বা (ক, খ) builder.or(a, b)
a এবং খ এবং (ক, খ) নির্মাতা এবং (ক, খ)
একটি লাইক খ যেমন (a, b) নির্মাতার মত(a, b)
একটি (c, d) এর মধ্যে মধ্যে (a, c, d) নির্মাতা.এর মধ্যে (a, c, d)
একটি শূন্য isNull(a) builder.isNull(a)
একটি শূন্য নয় isNotNull(a) builder.isNotNull(a)

সবকিছু সহজ, তাই না?

এবং কিভাবে আমরা ক্যোয়ারী বাছাই যোগ করবেন? খুব সহজ:

critQuery.select( critQuery.from(Employee.class) );
critQuery.where( builder.and(greaterThan, testers) );
critQuery.orderBy( builder.asc(root.get("salary"), builder.desc(root.get("joinDate") )

আপনি শুধু বস্তু কলক্রাইটেরিয়া কোয়েরিorderBy() পদ্ধতি এবং এটিতে প্রয়োজনীয় পরামিতিগুলি পাস করুন।

HQL-এ একই প্রশ্নটি কীভাবে দেখাবে তা এখানে। তুলনা করা:

select * from Employee
where (…) and (…)
order by 'salary' asc, 'joinDate' desc

আপনাকে শুধু 3টি জিনিস মনে রাখতে হবে:

  • SELECT, FROM, WHERE এর মতো কী অপারেটরগুলোকে কোনো বস্তুতে কল করা হয়ক্রাইটেরিয়া কোয়েরি.
  • AND, OR, DESC-এর মতো সহায়ক অপারেটরকে অবজেক্টে ডাকা হয়ক্রাইটেরিয়া বিল্ডার.
  • ক্ষেত্রের নাম get() এর মাধ্যমে বস্তু থেকে নেওয়া হয়মূল.