liferay整理(留着備用)

 

Liferay 6.1開發學習(二十):Dynamic Query高級查詢


在上一篇的博客《Liferay 6.1開發學習(十九):Liferay ServiceBuilder之自定義查詢》之中介紹了一部分簡單的Dynamic Query方法,能夠知足簡單的條件查詢,但有些場景這樣的查詢不能知足咱們的需求,同時使用HQL可能有稍顯麻煩,在這裏介紹一些Dynamic Query的高級技巧。(Dynamic Query的查詢持續更新到此篇博客)html

Group By 查詢

Dynamic Query中實現group by的查詢其實很是簡單,示例代碼以下:web

  1. DynamicQuery�0�2query�0�2=�0�2this.dynamicQuery(); �0�2�0�2學習

  2. ProjectionList�0�2list�0�2=�0�2ProjectionFactoryUtil.projectionList(); �0�2�0�2ui

  3. list.add(ProjectionFactoryUtil.rowCount()); �0�2�0�2this

  4. list.add(ProjectionFactoryUtil.groupProperty("bookNo")); �0�2�0�2spa

  5. list.add(ProjectionFactoryUtil.groupProperty("userId")); �0�2�0�2hibernate

  6. query.setProjection(list);�0�2�0�2插件

上面的代碼等效於select count(*),bookNo,userId from xxx group by bookNo,userIdorm

若是要再添加相應的過濾條件,則再query上再添加相應的語句,如:htm

query.add(PropertyFactoryUtil.forName("bookName").like("xxx"));

最後調用dynamicQuery(query);便可

子查詢

  1. DynamicQuery�0�2query�0�2=�0�2this.dynamicQuery(); �0�2�0�2

  2. DynamicQuery�0�2subQuery�0�2=�0�2new�0�2DynamicQueryFactoryUtil().forClass(Author.class); �0�2�0�2

  3. subQuery.setProjection(ProjectionFactoryUtil.property("authorId")); �0�2�0�2

  4. subQuery.add(PropertyFactoryUtil.forName("sex").eq(Boolean.FALSE)); �0�2�0�2

  5. query.add(PropertyFactoryUtil.forName("authorId").in(subQuery)); �0�2�0�2

  6. return�0�2dynamicQuery(query);�0�2�0�2

示例代碼如上,等效於如下的SQL:

Select * from books where authorId in(select authorId from author where sex=false)

OR查詢

Dynamic query中實現or查詢有兩種方法:

方法一:

Junction junction = RestrictionsFactoryUtil.disjunction();
junction.add(PropertyFactoryUtil.forName("xxxx").like("%"+keyWord+"%"));
junction.add(PropertyFactoryUtil.forName("xxx").like("%"+keyWord+"%"));
junction.add(PropertyFactoryUtil.forName("xxx").like("%"+keyWord+"%"));

query.add(junction);

方法二:

query.add(RestrictionsFactoryUtil.or("條件1",RestrictionsFactoryUtil.or("條件2",RestrictionsFactoryUtil.or("條件3", "條件4"))))

Dynamic Query的學習方法

Liferay中的Dynamic Query是封裝的Hibernate的Criteria Queries,Dynamic Query的資料雖然相對較少,全面的文檔更是難以找到,若是要學習,能夠參考hibernate的Criteria Queries的API,點擊此處

在Liferay中雖然和Hibernate的使用不徹底同樣,可是這上面的API頗有參考價值,應該說是學習Dynamic Query的最好文檔。

可能這裏有一個疑問,既然hibernate有了Criteria Query,Liferay幹嗎還要再封裝一次?這不是出力又不討好的事情麼?我思考了一下,可能緣由以下:

直接使用Hibernate的原生API,若是咱們要在插件工程中使用,則須要在每個插件工程中引入相應的Hibernate工程,這樣對於開發是很是不方便的,如今Liferay封裝了相應的接口,咱們在全部的portlet工程裏面均可以直接調用,不須要再引入第三方的Jar包,方便二次開發。

相關文章
相關標籤/搜索