استفاده از Query Language در Hibernate جاوا
از سری مقالات آموزش Java Enterprise, مبحث Query Language در Hibernate را برمیگزینیم.
همانطور که در تعریف Hibernate اشاره شد, این تکنولوژی به ما کمک میکند تا بتوانیم از طریق ایجادPersistent ها, اطلاعاتی که در پایگاه داده قرار دارند را در قالب Object ها نگهداری کنیم. عمل تراکنش با پایگاه داده بی نیاز از پیاده سازی دستورات پیچیده SQL است. ایجاد و مدیریت ارتباط با پایگاه داده و تفسیر کد های نوشته شده متناسب با ساختار پایگاده داده نیز از دیگر ویژگی های Hibernate است. همچنین دامنه گسترده ای از پایگاه داده ها را شامل میشود و برنامه نویس از همخوانی کد های نوشته شده با پایگاه داده آسوده خاطر است. اما گاهی نیاز است تا دستورات در ساختار دیگری پیاده سازی شوند و برنامه نویس اختیارات بیشتری برای اعمال دستورات لازم دارد.
Hibernate Query Language و یا به اختصار HQL, یک زبان است که با استفاده از شی گرایی دستورات را پیاده سازی میکند. این پیاده سازی, برخلاف دستورات SQL که با جداول و ستون ها کار میکنند, از Persistent Object ها و متغیر های درون آنها استفاده میکند. توجه داشته باشید که در اینجا برنامه نویس از HQL استفاده میکند و در هنگام تراکنش با پایگاه داده, دستورات به قالب SQL تبدیل میشوند. با وجود اینکه امکان استفاده از Native SQL در Hibernate وجود دارد, بهتر است از ساختار HQL برای دستورات استفاده کنید. زیرا احتمال بروز خطا را کاهش میدهد.
در HQL, کلمات کلیدی مانند Select, From, Where و کلمات مشابه این موارد, از اهمیت کمتری نسبت به جداول و ستون ها برخوردارند. برای مثال فرض کنید میخواهیم از دستور Select استفاده کنیم:
Session session = factory.openSession(); List<User> users = session.createQuery("from User").list();
اگر بخواهیم مستقیما به کلاس این جدول اشاره کنیم, میتوانیم به این صورت نیز بنویسیم:
List<User> users = session.createQuery("from Models.User").list();
همانطور که مشاهده میکنید, نام کلاس را با استفاده از مسیر Package آن مشخص کردیم.
اگر بخواهیم مقداری که بر میگردانیم با یک نام دلخواه باشد, میتوانیم از کلمه کلیدی As استفاده کنیم:
List<String> names = session.createQuery("select zeroToHeroUser.name from User as zeroToHeroUser").list();
در کد فوق, ابتدا دستور Select را برای واکشی از پایگاه داده فراخوانی کردیم. سپس دستور AS را بر روی آن اعمال کردیم. تمام دستورات SQL از این طریق قابل پیاده سازی هستند. اما در استفاده از SQL, همیشه باید یک نکته را مد نظر داشت. SQL Injection یکی از حملات بسیار مخربی است که ممکن است جبران خسارت آن بسیار دشوار باشد. برای رفع این خطر, چنین روشی برای پیاده سازی مقادیر ارسالی از برنامه به Hibernate در نظر گرفته شده است:
List<String> names = session.createQuery("select zeroToHeroUser.name from User " + "as zeroToHeroUser where zeroToHeroUser.id = 1").list();
در اینجا ما مقدار مورد نظر را صراحتا وارد کردهایم اما برای جلوگیری از SQL injection کد فوق را به این صورت تغییر میدهیم:
Query query = session.createQuery("select zeroToHeroUser.name from User " + "as zeroToHeroUser where zeroToHeroUser.id =:userId"); query.setParameter("userId", 1); List<String> names = query.getResultList();
دو متد بسیار مهم در HQL وجود دارد. این دو متد در برنامه هایی که مقدار نتیجه را به صورت دسته های منظم استفاده میکنند, مانند RESTful API بسیار کاربرد دارد:
Query query = session.createQuery(" from User " + "as zeroToHeroUser"); query.setFirstResult(2); query.setMaxResults(10); List<User> names = query.getResultList();
با استفاده از متد First Result, مشخص میکنیم که از چه سطری شروع به دریافت اطلاعات کند. توجه داشته باشید که در اینجا شماره سطر را مشخص میکنیم و این مقدار میتواند با Id تفاوت داشته باشد. با استفاده از Set Max, میتوانیم مشخص کنیم که نتیجه در دسته های چند تایی برگردد. برای مثال در کد فوق, از سطر دوم, ده مقدار را دریافت میکند و برمیگرداند.
اگر بخواهیم دستورات را به صورت native SQL وارد کنیم باید از متد create native query استفاده کنیم:
NativeQuery query = session.createNativeQuery("select name from User"); List<String> names = query.getResultList();
در این مقاله سعی بر این شد تا انواع Query Language در Hibernate را مورد بررسی قرار دهیم.
سری مقالات آموزش Java Enterprise ادامه دارد.
با ما همراه باشید.
مطالب زیر را حتما مطالعه کنید
از Java به Dart – کلاس و Constructor
آموزش Gradle – اهمیت Project Automation
تفاوت Sequence و List در کاتلین
بهترین محیط های توسعه(IDE) برای جاوا
Open/Closed Principle در قوانین Solid
توابع در زبان برنامه نویسی Kotlin
2 Comments
Join the discussion and tell us your opinion.
دیدگاهتان را بنویسید لغو پاسخ
برای نوشتن دیدگاه باید وارد بشوید.
با سلام . خیلی خیلی ممنون بابت مطالب بسیار خوبتون . لطفا همینطور اموزش های جاوای بیشتری قرار بدید . یک انتقاد هم داشتم اونم اینکه وقتی در وسط صفحه سایت هستیم و یک مقدار که اسکرول رو به بالا میکشیم نوار ابزار مشکی بالای صفحه میاد پایین و این خیلی ازار دهندست اگر درستش کنید خیلی عالی میشه . با تشکر
سلام دوست عزیز. ممنون از همراهی و توجهتون. حتما از طرف مجموعه پیگیری میشه. با تشکر