2.1 কোয়েরি ক্লাসের ভূমিকা

যাইহোক, আরেকটি গুরুত্বপূর্ণ পয়েন্ট হল ক্যোয়ারী হেল্পার ক্লাস। আপনি এই উদাহরণে এটি দেখতে পারেন:

public List<Employee> getAllEmployes() {
    try (Session session = sessionFactory.openSession()) {
            Query<Employee> query = session.createQuery("from Employee", Employee.class);
            return query.list();
    }
}

প্রকৃতপক্ষে, ক্যোয়ারী একটি ইন্টারফেস এবং এটি বিভিন্ন ক্ষেত্রে বিভিন্ন বাস্তবায়ন আছে। তবে সরলতার জন্য, আমি এটিকে একটি ক্লাস বলতেই থাকব। এটি, ধরা যাক, একটি বিস্তৃত অর্থে একটি শ্রেণী - OOP এর পরিপ্রেক্ষিতে।

বিঃদ্রঃ. দুটি শ্রেণী ছিল:

  • ক্যোয়ারী বর্ণনা করতে ক্যোয়ারী .
  • একটি পরিচিত টাইপ সহ একটি প্রশ্নের বর্ণনা করতে TypedQuery .

প্রথমটি যখন হাইবারনেট ইতিমধ্যেই বিদ্যমান ছিল, এবং এখনও কোন জেনেরিক ছিল না। তারপর, JDK 5 প্রকাশের পরে, হাইবারনেটে আরেকটি ক্লাস যুক্ত করা হয়েছিল - TypedQuery, যা ইতিমধ্যেই কোয়েরির ফলাফল টাইপিং সমর্থন করেছিল।

কিন্তু, যতদূর আমার মনে আছে, হাইবারনেটের 5 তম সংস্করণ দিয়ে শুরু করে, শুধুমাত্র একটি টাইপ করা ক্লাস বাকি ছিল এবং এটিকে এখন Query বলা হয়।

একটি প্রশ্ন তৈরি করার আদর্শ উপায় হল:


Query<Employee> query = session.createQuery("from Employee", Employee.class);

আপনি শিখেছেন কিভাবে কোয়েরি অবজেক্ট তৈরি করতে হয়, কিন্তু কিভাবে আপনি এই প্রশ্নগুলি চালাবেন?

এটি এখানে আরও সহজ - আমরা ক্যোয়ারী অবজেক্টে তালিকা() পদ্ধতিটিকে কল করি:


Query<Employee> query = session.createQuery("from Employee", Employee.class);
List<Employee> resultLіst = query.list();

list() পদ্ধতির একটি JPA প্রতিশব্দ আছে, একটি পদ্ধতি যা একই কাজ করে কিন্তু তাকে getResultList() বলা হয় । আপনি কখনও কখনও এটি অন্যান্য প্রোগ্রামার দ্বারা লিখিত কোড দেখতে পারেন.

যাইহোক, যদি কোয়েরিটি বোঝায় যে ফলাফলটি একটি একক ফলাফলে হবে, তাহলে ক্যোয়ারীটি কল করার জন্য uniqueResult() পদ্ধতি ব্যবহার করা সহজ ।


Query<Employee> query = session.createQuery("from Employee where id = 1", Employee.class);
Employee result = query.uniqueResult();

uniqueResult() পদ্ধতির একটি JPA প্রতিশব্দ আছে, singleResult() পদ্ধতি । এটি জেপিএ স্ট্যান্ডার্ডের সাথে হাইবারনেটের সামঞ্জস্যের জন্য চালু করা হয়েছিল। তিনি ঠিক একই জিনিস করেন।

2.2 কোয়েরি ক্লাস পদ্ধতি

আসলে, ক্যোয়ারী ক্লাসে অনেকগুলি বিভিন্ন পদ্ধতি রয়েছে। নীচে আমি তাদের আরও তিনটি সম্পর্কে কথা বলব।

প্রথমটি হল স্ট্রিম() পদ্ধতি । এবং এর JPA প্রতিশব্দ getResultStream()

এই উভয় পদ্ধতি একটি তালিকার পরিবর্তে ডেটার একটি প্রবাহ ফেরত দেয়। এই পদ্ধতিটি খুব কার্যকর হতে পারে যখন আপনার একবারে একটি প্রশ্নের ফলে প্রাপ্ত সমস্ত বস্তুর প্রয়োজন হয় না। অথবা একটি সম্ভাবনা আছে যে শুধুমাত্র তাদের প্রথম ব্যবহার করা হবে.

উদাহরণ:


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
Stream<Employee> stream = query.stream();

দ্বিতীয় পদ্ধতি হল executeUpdate() পদ্ধতি । আপনি একটি প্রশ্ন লিখতে পারেন যা ডাটাবেসে কিছু পরিবর্তন করবে। এই ক্ষেত্রে, এটি প্রয়োজনীয় যে ডাটাবেস অ্যাক্সেস করার সময় হাইবারনেট শুধুমাত্র পঠনযোগ্য লেনদেন ব্যবহার করে না।

অনুরোধের উদাহরণ: আমরা 1 দ্বারা সমস্ত ব্যবহারকারীর স্তর বাড়ানোর সিদ্ধান্ত নিয়েছি।


Query<User> query = session.createQuery("update User set level=level+1", User.class);
int count = query.executeUpdate();

executeUpdate() পদ্ধতিটি আসলে পরিবর্তিত সারির সংখ্যা ফেরত দেবে।

এবং অবশেষে তৃতীয় পদ্ধতি হল scroll() । আমরা আপনাকে এটি সম্পর্কে আরও কিছু বলব।

2.3 স্ক্রোল ক্লাস পদ্ধতি

এই পদ্ধতিটি কিছুটা stream() পদ্ধতির অনুরূপ । শুধুমাত্র এটি আপনাকে ফলাফলগুলিকে মোটেও টানা ছাড়াই ফলাফলের তালিকার মধ্য দিয়ে যেতে দেয়। অর্থাৎ, আপনি একটি ক্যোয়ারী চালাতে পারেন, তারপর ফলাফলের মিলিয়নতম লাইনে স্ক্রোল করুন এবং সেখান থেকে ডেটা পড়া শুরু করুন।

যেমন একটি উন্নত পুনরাবৃত্তিকারী.


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();

ScrollableResults অবজেক্টের নিম্নলিখিত পদ্ধতি রয়েছে:

পদ্ধতি বর্ণনা
আর পেতে() বর্তমান উপাদান প্রদান করে
পরবর্তী() পয়েন্টারটিকে পরবর্তী উপাদানে নিয়ে যায়
আগে() পয়েন্টারটিকে আগের এলিমেন্টে নিয়ে যায়
স্ক্রোল (int আকার) সাইজ লাইন দ্বারা সামনের দিকে স্ক্রোল করুন
অবস্থান (int pos) উপাদান pos সংখ্যা বর্তমান উপাদান করে তোলে
শেষ() বর্তমান উপাদান এখন শেষ
প্রথম() বর্তমান উপাদান এখন প্রথম
getRowNumber() বর্তমান লাইন নম্বর প্রদান করে
setRowNumber() বর্তমান লাইন নম্বর সেট করে

ধরা যাক আপনি একটি ক্যোয়ারী চালিয়েছেন এবং আপনি শেষ উপাদানটি পেতে চান। এটি কীভাবে করবেন তা এখানে:


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();
scroll.last();
Employee lastEmployee = scroll.get();