جاوا و تکنولوژی های آن

java programming language

در این وبلاگ به بررسی نکات موجود در جاوا و تکنولوژی های آن می پردازیم

طبقه بندی موضوعی


در این بخش خواهیم دید که چگونه میتوان با 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









نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی