آشنایی با Query های خاص منظوره در لایفری (Dynamic Query)

نویسنده: جناب آقای محمد خدایی‌مهر

Liferay Dynamic Query API ویژگی جالبی در توسعه پورتلت های Liferay است که به شما امکان ساخت کوئری های پویا را می دهد. با استفاده از ابزار Liferay Service Builder می توان تمامی سرویس های مورد نیاز پایگاه داده در پورتلت را ایجاد کرد، اما گاهی نیاز های به خصوصی داریم که به سرویس های سفارشی نیاز دارند. در این مواقع از Liferay Dynamic Query API به منظور رفع این نیاز ها استفاده می کنیم. Dynamic Query API تنها قادر به اجرای عملیات های read در پایگاه داده می باشد و به طور مخصوص از آن برای جستجو در پایگاه داده استفاده می کنیم.

اگرچه برای رفع نیازهای پیش آمده می توان از Custom SQL استفاده کرد، اما باید توجه داشت Custom SQL وابسته به service builder است و برای پیاده سازی Custom SQL باید مراحل طولانی تری نسبت به Dynamic Query را طی کنیم. همچنین در صورتی که بخواهیم service را در هربار تغییر دهیم یا اصلاح کنیم باید service builder را اجرا کنیم.

Dynamic Query API ویژگی مستقلی است و می توان آن را در هر مرحله و نقطه ای از فرایند توسعه پیاده سازی کرد.

مراحل کلی ایجاد Dynamic Query

  1. ایجاد شی Dynamic Query در کلاس entity model
  2. ایجاد و افزودن Criteria به شی Dynamic Query
  3. فراخوانی Dynamic Query با استفاده از XXXLocalServiceUtil

 

ایجاد شی Dynamic Query در کلاس entity model

فرض می کنیم می خواهیم داده ها را از جدول Student واکشی کنیم. در ادامه روش ایجاد شی Dynamic Query را مشاهده می کنید.

مهمترین نکته در کد بالا ارسال class loader مربوطه است.

Class loader  ها به دو دسته تقسیم می شوند:

  1. Portal Class Loader
  2. Portlet Class Loader

 

Portal Class Loader

برای نوع class یا model class در سطح portal باید از Portal Class Loader در شی Dynamic Query استفاده کنیم.

در تکه کد زیر از Util class برای دریافت شی Portal Class Loader استفاده می کنیم.

هنگامی که به پیاده سازی Dynamic Query در تقابل با سطوح جداول پورتال یا کلاس های model می پردازیم، باید از portal class loader استفاده کنیم.

به عنوان مثال تعدادی از این کلاس ها را در زیر می توانید مشاهده کنید:

Portlet Class Loader

Portlet Class Loader به هر پورتلت به خصوصی وابسته است. در محیط Plugin Portlet، هر context دارای class loader مخصوص به خود می باشد و این class loader مسئول بارگذاری کلاس های مربوط به portlet context است.

از تکه کد زیر برای ایجاد شی portlet class loader استفاده می کنیم:

پیاده سازی Dynamic Query در سطح Portal

توجه: با اجرای تکه کد بالا لیستی از اشیاء از نوع User حاصل می شود.

پیاده سازی Dynamic Query در سطح Plugin Portlet


توجه: با اجرای تکه کد بالا لیستی از اشیاء نوع Student حاصل می شود.

ایجاد Criteria و افزودن آن به شی Dynamic Query

Criteria به منظور اعمال قوانین خواندن از پایگاه داده مورد استفاده قرار می گیرد. هنگامی که SQL Query می نویسیم از عملیات ها و شرایط مختلفی برای رسیدن به نتایج گوناگون استفاده می کنیم. به طور مشابه در Dynamic Query با استفاده از Criteria می توان شرایط و عملیات های مختلف را پیاده سازی کرد.

برای اعمال این شرایط از دو کلاس Util زیر استفاده می کنیم:

مثال:

فرض کنید به کوئری زیر نیاز داریم:

در ادامه به تشریح و پیاده سازی انواع مختلف Dynamic Query می پردازیم.

Dynamic Query نوع اول

Dynamic Query بالا به منظور پیاده سازی عملیات AND استفاده می شود. PropertyFactoryUtil تمامی عملگرها و متدها مانند =، >، < و like را داراست.

توجه: با مراجعه به PropertyFactoryUtil API می توانید تمامی متدها و کاربرد آن ها را مشاهده کنید.

Dynamic Query نوع دوم

در مثال زیر اشیاء Criteria مجزا ایجاد می کنیم و پس از تکمیل، آن را به Dynamic Query اضافه می کنیم.

کلاس RestrictionsFactoryUtil برای اعمال شرط هایی مانند AND، OR، IN با استفاده از WHERE مورد استفاده قرار می گیرد.

Dynamic Query نوع سوم

اگر شرط WHERE تمامی عملگرهای AND/OR بین ستون ها را داشته باشد، می توانیم از junction استفاده کنیم.

عملگر AND

عملگر OR

توجه: تمام Dynamic Query های بالا نتایج یکسانی را می دهند اما روش نوشتن آن ها متفاوت است. هنگامی که Query ایجاد می کنیم، باید هر Criteria را به شی criteria قبل اضافه کنیم.

پس از آن که سرویس را build کردیم، Dynamic Query به SQL Query تبدیل خواهد شد و از آن در سطح کلاس های API استفاده می شود.

فراخوانی Dynamic Query با استفاده از کلاس XXXLocalServiceUtil

هنگامی که شی Dynamic Query را ایجاد می کنیم، از کلاس XXXLocalServiceUtil به منظور فراخوانی کوئری استفاده کرده و لیستی از رکورد ها حاصل می شود.

مثال:

توجه: Dynamic Query را در هر قسمتی از توسعه مانند صفحات jsp، کلاس Portlet Action و XXXServiceImpl.java می توان ستفاده کرد.

بهترین تمرین های پیاده سازی Dynamic Query API

اگر بخواهیم عملیات جستجو در پایگاه داده را پیاده سازی کنیم، می توان از Dynamic Query API استفاده کرد.

با پیاده سازی Dynamic Query در XXXLocalServiceImpl.java می توانیم از آن در قسمتی از برنامه استفاده کرد.

شرط AND در Dynamic Query

شرط OR در Dynamic Query

Import های مهم در Dynamic Query

مثال ساده ای از Dynamic Query

    ارسال نظر

    نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

بالا