در این بخش راه های sort کردن با JPA را بررسی خواهیم کرد
روش JQL API :
با کمک دستور Order By
String jql ="Select f from Foo as f order by f.id"; Query query = entityManager.createQuery (jql);
با این کوئری دستور SQL زیر ساخته میشود :
Hibernate: select foo0_.id as id1_4_, foo0_.name as name2_4_ from Foo foo0_ order by foo0_.id
* بصورت پیش فرض نوع Order از نوع Ascending است
مرتب سازی با Order By و Descending :
String jql = "Select f from Foo as f order by f.id desc"; Query sortQuery = entityManager.createQuery(jql);
کوئری ساخته شده :
Hibernate: select foo0_.id as id1_4_, foo0_.name as name2_4_ from Foo foo0_ order by foo0_.id desc
مرتب سازی بر اساس Order By و ترکیب Ascending و Descending :
String jql ="Select f from Foo as f order by f.name asc, f.id desc"; Query sortQuery = entityManager.createQuery(jql);
کوئری ساخته شده :
Hibernate: select foo0_.id as id1_4_, foo0_.name as name2_4_ from Foo foo0_ order by foo0_.name asc, foo0_.id desc
مرتب سازی بر اساس الویت با مقادیر Null :
پیش فرض الویت مرتب سازی مقادیر Null در هر دیتابیسی متفاوت است و ما میتوانیم در HQL با NULLS FIRST و NULLS LAST آنرا مشخص کنیم
در مثال زیر مرتب سازی بر اساس name نزولی و قرار دادن مقادیر NULL در انتها :
Query sortQuery = entityManager.createQuery ("Select f from Foo as f order by f.name desc NULLS LAST");
کوئری ساخته شده :
Hibernate: select foo0_.id as id1_4_, foo0_.BAR_ID as BAR_ID2_4_, foo0_.bar_Id as bar_Id2_4_, foo0_.name as name3_4_,from Foo foo0_ order by case when foo0_.name is null then 1 else 0 end, foo0_.name desc
مرتب سازی روابط One To Many :
فرض کنید کلاس Bar میتواند مجموعه ای از کلاس Foo داشته باشد و در کوئری میخواهیم ابتدا نتایج Bar مرتب شوند و بعد مجموعه Foo آنها مرتب شوند
ابتدا به مجموعه Foo در کلاس Bar با استفاده از OrderBy@ نوع مرتب سازی و فیلد مورد نظر را مشخص میکنیم :
استفاده از این annotation اختیاری است و در این مورد چون هر بار نیاز داریم که این نوع مرتب سازی انجام شود یکبار انرا ست میکنیم
@OrderBy("name ASC") List <Foo> fooList;
و بعد کوئری را با Order By میزنیم :
String jql = "Select b from Bar as b order by b.id"; Query barQuery = entityManager.createQuery(jql); List<Bar> barList = barQuery.getResultList();
کوئری ساخته شده :
Hibernate: select bar0_.id as id1_0_, bar0_.name as name2_0_ from Bar bar0_ order by bar0_.id Hibernate: select foolist0_.BAR_ID as BAR_ID2_0_0_, foolist0_.id as id1_4_0_, foolist0_.id as id1_4_1_, foolist0_.BAR_ID as BAR_ID2_4_1_, foolist0_.bar_Id as bar_Id2_4_1_, foolist0_.name as name3_4_1_ from Foo foolist0_ where foolist0_.BAR_ID=? order by foolist0_.name asc
مرتب سازی با JPA Criteria :
JPA Criteria برای مرتب سازی متد orderBy را ارئه کرده است که میتوان در پارامتر های آن نوع نزولی و صعودی و فیلد مورد نظر را تعیین کرد :
CriteriaQuery<Foo> criteriaQuery = criteriaBuilder.createQuery(Foo.class); Root<Foo> from = criteriaQuery.from(Foo.class); CriteriaQuery<Foo> select = criteriaQuery.select(from); criteriaQuery.orderBy(criteriaBuilder.asc(from.get("name")));
جایی که نام فیلد را میگیرد که در اینجا name است به حروف بزرگ و کوچک حساس است
با کد بالا HQL زیر ساخته میشود :
Hibernate: select foo0_.id as id1_4_, foo0_.name as name2_4_ from Foo foo0_ order by foo0_.name asc
مرتب سازی با JPA Criteria وقتی بیشتر از یک فیلد نیاز داشتیم :
CriteriaQuery<Foo> criteriaQuery = criteriaBuilder.createQuery(Foo.class); Root<Foo> from = criteriaQuery.from(Foo.class); CriteriaQuery<Foo> select = criteriaQuery.select(from); criteriaQuery.orderBy(criteriaBuilder.asc(from.get("name")), criteriaBuilder.desc(from.get("id")));
HQL ساخته شده :
Hibernate: select foo0_.id as id1_4_, foo0_.name as name2_4_ from Foo foo0_ order by foo0_.name asc, foo0_.id desc