در این بخش خواهیم دید که چگونه میتوان با Hibernate و Criteria API نتایج مرتب شده ای داشته باشیم
مرتب سازی با HQL :
با استفاده از عبارت Order By در HQL میتوان نتایج مرتب شده را دریافت کرد :
String hql = "FROM Foo f ORDER BY f.name"; Query query = sess.createQuery(hql);
کوئری تولید شده :
Hibernate: select foo0_.ID as ID1_0_, foo0_.NAME as NAME2_0_ from FOO foo0_ order by foo0_.NAME
مشخص کردن ترتیب مرتب سازی :
String hql = "FROM Foo f ORDER BY f.name ASC"; Query query = sess.createQuery(hql);
کوئری تولید شده :
Hibernate: select foo0_.ID as ID1_0_, foo0_.NAME as NAME2_0_ from FOO foo0_ order by foo0_.NAME ASC
مرتب سازی بیشتر از یک فیلد :
String hql = "FROM Foo f ORDER BY f.name DESC, f.id ASC"; Query query = sess.createQuery(hql);
کوئری تولید شده :
Hibernate: select foo0_.ID as ID1_0_, foo0_.NAME as NAME2_0_ from FOO foo0_ order by foo0_.NAME DESC, foo0_.ID ASC
مرتب سازی مقادیر NULL :
با استفاده از NULLS FIRST و NULLS LAST در HQL میتوان مشخص کرد که مقادیر NULL در ابتدا مرتب شوند و یا در انتها :
String hql = "FROM Foo f ORDER BY f.name NULLS LAST"; Query query = sess.createQuery(hql);
کوئری تولید شده :
Hibernate: select foo0_.ID as ID1_1_, foo0_.NAME as NAME2_1_, foo0_.BAR_ID as BAR_ID3_1_, foo0_.idx as idx4_1_ from FOO foo0_ order by case when foo0_.NAME is null then 1 else 0 end, foo0_.NAME
مرتب سازی روابط One To Many :
با استفاده از OrderBy@ میتوان مرتب سازی مجموعه Many را مشخص کرد
@OrderBy(clause = "NAME DESC") Set<Foo> fooList = new HashSet();
String hql = "FROM Bar b ORDER BY b.id"; Query query = sess.createQuery(hql);
کوئری تولید شده :
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_ID3_0_0_, foolist0_.ID as ID1_1_0_, foolist0_.ID as ID1_1_1_, foolist0_.NAME as NAME2_1_1_, foolist0_.BAR_ID as BAR_ID3_1_1_, foolist0_.idx as idx4_1_1_ from FOO foolist0_ where foolist0_.BAR_ID=? order by foolist0_.NAME desc
مرتب سازی با Criteria API :
Criteria API متد addOrder که آرگومان ورودی آن یکی از حالت های asc و desc از کلاس Order است عملیات مرتب سازی را انجام میدهد :
Criteria criteria = sess.createCriteria(Foo.class, "FOO"); criteria.addOrder(Order.asc("id"));
کوئری تولید شده :
Hibernate: select this_.ID as ID1_0_0_, this_.NAME as NAME2_0_0_ from FOO this_ order by this_.ID sac
مرتب سازی به Criteria API و بیش از یک فیلد :
Criteria criteria = sess.createCriteria(Foo.class, "FOO"); criteria.addOrder(Order.asc("name")); criteria.addOrder(Order.asc("id"));
کوئری تولید شده :
Hibernate: select this_.ID as ID1_0_0_, this_.NAME as NAME2_0_0_ from FOO this_ order by this_.NAME asc, this_.ID sac
مرتب سازی با Criteria API و مقادیر NULL :
Criteria criteria = sess.createCriteria(Foo.class, "FOO"); criteria.addOrder(Order.asc("name").nulls(NullPrecedence.LAST));
کوئری تولید شده :
Hibernate: select this_.ID as ID1_1_1_, this_.NAME as NAME2_1_1_, this_.BAR_ID as BAR_ID3_1_1_, this_.idx as idx4_1_1_, bar2_.ID as ID1_0_0_, bar2_.NAME as NAME2_0_0_ from FOO order by case when this_.NAME is null then 1 else 0 end, this_.NAME asc
اگر بخواهیم مقادیر null در ابتدای مرتب سازی نزولی قرار بگیرند :
Criteria criteria = sess.createCriteria(Foo.class, "FOO"); criteria.addOrder(Order.desc("name").nulls(NullPrecedence.FIRST));
کوئری تولید شده :
Hibernate: select this_.ID as ID1_1_1_, this_.NAME as NAME2_1_1_, this_.BAR_ID as BAR_ID3_1_1_, this_.idx as idx4_1_1_, bar2_.ID as ID1_0_0_, bar2_.NAME as NAME2_0_0_ from FOO order by case when this_.NAME is null then 0 else 1 end, this_.NAME desc
دقت داشته باشید اگر هنگام مرتب سازی مقادیر NULL فیلد مورد نظر از نوع Primitive مانند Int بود خطای PersistenceException را دریافت خواهیم کرد :
String jql = "Select f from Foo as f order by f.anIntVariable desc NULLS FIRST"; Query sortQuery = entityManager.createQuery(jql);
خطای پرتاب شده :
javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of com.cc.jpa.example.Foo.anIntVariable