HQL :
زبانی شبیه SQL برای کوئری زدن در هایبرنیت که به جای بکار گرفتن نام جداول و ستونها با entity ها و فیلد ها کار میکند
نمونه : from Cat as cat برای select زدن روی جدولی که در کلاس Cat تعریف شده است
میتوانیم از دو جدول هم کوئری بگیریم که جواب آن بصورت ضرب دکارتی بر میگردد
from Formula , Parameter
و خروجی را بصورت ArrayList ای از آرایه ها خواهیم داشت و اندیس اول از Formula و اندیس دوم از Parameter خواهد بود و اگر بخواهیم لیست برگشتی فقط لیستی از Formula باشد میتوان HQL را به این صورت نوشت :
select f from Formula f , Parameter
و اگر بخواهیم بجای List ای از آرایه ها List ای از List ها بگیریم میتوان HQL را به این صورت تغییر داد :
select new List(f) from Formula f , Parameter
از همین روش بالا میتوان ابجکت های model ای داشت که در constractor آرگومان هایی را دریافت کند و در HQL صراحتا مقادیر دریافتی را به آن ارگومان ها پاس بدهیم و خروجی List ای از آن ابجکت دریافت کنیم
**نکته : اصولی نیست که کوئری را برای دو Entity بزنیم و باید تا آنجا که ممکن است دوری کنیم
fetch : در کوئری های join زدن ها اگر بخواهیم ستون های جدول دوم را هم دریافت کنیم میتوانیم بعد از کلمه join از fetch استفاده کنیم
**نکته : left join پرفرمانس دیتابیس را تا حد زیادی کم میکنم و راه حل این است که بجای اینکه مقادیر f.key را optional بگیریم حتما برای مقادیر optional از یک مقدار پیش فرض که توسط خودمان تعیین میشود استفاده کنیم که همیشه بتوانیم از inner join استفاده کنیم
Named Query :
میتوان در کلاس های Entity کوئری های از پیش تعریف شده ای با یک نام ایجاد کرد و در طول برنامه با استفاده از نام کوئری از آن استفاده کرد
@Entity @NamedQueries( @NamedQuery(name="getUserById" , query="from User where userId = :pUserId") ) public class User { private int userId; private String username; ... }
با استفاده از Name Query ها کوئری ها از لحاظ ساختاری و اجر چک میشوند و آنها در حافظه cache می شوند
Query query = session.createNamedQuery("getUserById") .setParameter("pUserId",1); List<User> list = query.list();
Native Query :
هایبرنیت از کلیه دستورات و امکانات SQL استفاده نمیکند مثل Union و یا میخواهیم بجای HQL از SQL استفاده کنیم ، ما میتوانیم با استفاده از Native Query از آنها استفاده کنیم
session.createNativeQuery ("select * from user" , User.class).list();
که همانند NamedQueries@ میتوان از NativeQueries@ استفاده کرد و دسته ای از Native Query ها را ایجاد کرد