NativeQuery

বিদ্যমান

3.1 ভূমিকা

আরেকটি দরকারী জিনিস সম্পর্কে আমি কথা বলতে চাই NativeQuery । আপনি ইতিমধ্যে জানেন, NativeQuery ব্যবহার করে, আপনি নেটিভ এসকিউএল-এ প্রশ্ন লিখতে পারেন। যাইহোক, আরও মজার বিষয় হল যে ক্যোয়ারী ফলাফল পাওয়ার সময় আপনাকে ক্লাস ম্যাপিং ব্যবহার করতে হবে না।

আমি বরং আপনাকে একটি উদাহরণ দেখাতে চাই:

List<Object[]> persons = session.createNativeQuery("SELECT * FROM Person").list();

এই উদাহরণে, আমরা এমন একটি ক্লাস পাস করি না যা ক্যোয়ারী ফলাফল সারিগুলির সাথে মেলে, পরিবর্তে আমরা অবজেক্ট অবজেক্টের একটি অ্যারে ব্যবহার করি।

আপনি যদি একটি টেবিলে মাত্র কয়েকটি কলাম নির্বাচন করতে চান তবে এটি কার্যকর হতে পারে। উদাহরণ:

List<Object[]> persons = session.createNativeQuery("SELECT id, name FROM Person").list();

for(Object[] person : persons) {
    Number id = (Number) person[0];
    String name = (String) person[1];
}

এটি কিছুটা JDBC পদ্ধতির অনুরূপ যখন আপনি একটি ResultSet অবজেক্ট পান এবং এর সারি থেকে ডেটা পড়েন।

যাইহোক, হাইবারনেট এটিকে আরও নির্ভরযোগ্য করতে বিভিন্ন উপায় অফার করে। উদাহরণস্বরূপ, আপনি যে ধরনের কলামগুলি বিয়োগ করতে চান তা নির্দিষ্ট করতে পারেন। উদাহরণ:

Query<Object[]> query = session.createNativeQuery("SELECT id, name FROM Person");
query.addScalar("id", StandardBasicTypes.LONG);
query.addScalar("name", StandardBasicTypes.STRING);
List<Object[]> persons = query.list();

for(Object[] person : persons) {
    Long id = (Long) person[0];
    String name = (String) person[1];
}

3.2 সত্তা ম্যাপিং

NativeQuery- এর ফলাফল পার্স করার সময় হাইবারনেটের যে ক্লাসটি ব্যবহার করা উচিত তা আপনি স্পষ্টভাবে উল্লেখ করতে পারেন । এটি বিভিন্ন উপায়ে করা যেতে পারে।

Query<Person> query = session.createNativeQuery("SELECT * FROM Person")
    .addEntity(Person.class);
    .list();

এবং অবশ্যই, আপনি জানেন ভাল পুরানো বিন্যাস:

Query<Person> query = session.createNativeQuery("SELECT * FROM Person", Person.class).list();

প্রথম পদ্ধতিটি হল স্থানীয় হাইবারনেট পদ্ধতি এবং দ্বিতীয়টি হল JPA পদ্ধতি। JPA পদ্ধতিটি আরও সুবিধাজনক এবং সংক্ষিপ্ত, যেহেতু হাইবারনেট বহু বছর ধরে থাকার পরে এই মানটি উদ্ভাবিত হয়েছিল। এবং হাইবারনেট বিকশিত হয়েছে এবং তার পুরানো সংস্করণগুলির সাথে সামঞ্জস্য বজায় রাখার জন্য পুরানো পদ্ধতির সমর্থন করতে বাধ্য হয়েছিল।

যাইহোক, এর পদ্ধতির জন্য ধন্যবাদ, হাইবারনেট আপনাকে ক্যোয়ারী ফলাফল ম্যাপিংয়ের সাথে একটি ক্লাস নয়, বরং বেশ কয়েকটি ক্লাস সংযুক্ত করতে দেয়। উদাহরণ:

List<Phone> results = session.createNativeQuery(
    "SELECT {ph.*}, {pr.*}" +
    "FROM Phone ph" +
    "JOIN Person pr ON ph.person_id = pr.id")
.addEntity("ph", Phone.class)
.addJoin("pr", "ph.person")
.list();

for (Phone. phone : results) {
           	assertNotNull( phone.getPerson().getName() );
}

NativeQuery ব্যবহার করে এই পদ্ধতিটি ডাটাবেস থেকে ডেটা নির্বাচনের গতি বাড়ানোর জন্য ব্যবহার করা যেতে পারে। আপনি যদি জানেন যে আপনার কিছু কলামের প্রয়োজন নেই, আপনি অনুরোধে সেগুলি ছেড়ে দিতে পারেন।

হাইবারনেট ক্যাশে বা LazyLoading মেকানিজম ব্যবহার করতে চাইলেও আপনি একবারে সমস্ত চাইল্ড এন্টিটি লোড করতে পারেন । উপরন্তু, আপনার শিশু সত্তার ডাটাবেসে অনেকগুলি কলাম থাকতে পারে এবং আপনি শুধুমাত্র কয়েকটি নির্বাচন করতে পারেন।

3.3 DTO ম্যাপিং

হাইবারনেট আপনাকে ফলাফল ম্যাপ করার জন্য নন-এন্টিটি ক্লাস ব্যবহার করার অনুমতি দেয়। ক্লাস যেগুলোর কোনো টীকা নেই এবং কোনো টেবিলে ম্যাপ করা নেই।

উদাহরণ:

public class PersonSummaryDTO {
    private Number id;
    private String name;

    public Number getId() {
    	return id;
    }

    public void setId(Number id) {
    	this.id = id;
    }

    public String getName() {
    	return name;
    }

    public void setName(String name) {
    	this.name = name;
	}
}

List<PersonSummaryDTO> dtos = session.createNativeQuery(
    "SELECT p.id as \"id\", p.name as \"name\" FROM Person p")
.setResultTransformer(Transformers.aliasToBean(PersonSummaryDTO.class) )
.list();

যেহেতু PersonSummaryDTO ক্লাসে কোনো টীকা নেই, তাই SQL কোয়েরির কলামের নাম অবশ্যই PersonSummaryDTO ক্লাসের ক্ষেত্রের নামের সাথে মিলবে।

আপনি যদি একটি বাহ্যিক ডাটাবেস থেকে ডেটা পড়ছেন যেখানে আপনার অ্যাপ্লিকেশন শুধুমাত্র-পঠন মোডে সংযুক্ত রয়েছে তবে এটি খুব কার্যকর হতে পারে। অর্থাৎ, আপনাকে 50+ কলাম আছে এমন টেবিলগুলিতে অ্যাক্সেস দেওয়া হয়েছিল, তারা নির্বাচনের গতি বাড়ানোর জন্য একটি অস্বাভাবিক আকারে ডেটা সংরক্ষণ করে।

বা ধরা যাক যে কেউ একটি টেবিলে ক্লাসের শ্রেণিবিন্যাস সংরক্ষণ করার সিদ্ধান্ত নিয়েছে এবং পাঁচ বছরে এই টেবিলটি এত বেড়েছে যে শয়তান তার পা ভেঙে দেবে। আপনাকে এই টেবিল থেকে কয়েকটি কলাম নির্বাচন করতে হবে (আইডি এবং ব্যবহারকারীর নাম) এবং সেগুলি ক্লায়েন্টকে দিতে হবে।

আমি মনে করি আপনি বুঝতে পেরেছেন, তবে আপনি যদি এই বিষয়ে আরও গভীরে যেতে চান তবে আপনি লিঙ্কটিতে আরও পড়তে পারেন:

নেটিভ এসকিউএল কোয়েরি

মন্তব্য
  • জনপ্রিয়
  • নতুন
  • পুরানো
মন্তব্য লেখার জন্য তোমাকে অবশ্যই সাইন ইন করতে হবে
এই পাতায় এখনও কোনো মন্তব্য নেই