Liferay 6.1开发学习(二十):Dynamic Query高级查询

2013年05月30日 Liferay 评论 1 条 阅读 16,467 views 次

在上一篇的博客《Liferay 6.1开发学习(十九):Liferay ServiceBuilder之自定义查询》之中介绍了一部分简单的Dynamic Query方法,可以满足简单的条件查询,但有些场景这样的查询不能满足我们的需求,同时使用HQL可能有稍显麻烦,在这里介绍一些Dynamic Query的高级技巧。(Dynamic Query的查询持续更新到此篇博客)

Group By 查询

在Dynamic Query中实现group by的查询其实非常简单,示例代码如下:

  1. DynamicQuery query = this.dynamicQuery();   
  2. ProjectionList list = ProjectionFactoryUtil.projectionList();   
  3. list.add(ProjectionFactoryUtil.rowCount());   
  4. list.add(ProjectionFactoryUtil.groupProperty("bookNo"));   
  5. list.add(ProjectionFactoryUtil.groupProperty("userId"));   
  6. query.setProjection(list);  

上面的代码等效于select count(*),bookNo,userId from xxx group by bookNo,userId

如果要再添加相应的过滤条件,则再query上再添加相应的语句,如:

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

最后调用dynamicQuery(query);即可

子查询

  1. DynamicQuery query = this.dynamicQuery();   
  2. DynamicQuery subQuery = new DynamicQueryFactoryUtil().forClass(Author.class);   
  3. subQuery.setProjection(ProjectionFactoryUtil.property("authorId"));   
  4. subQuery.add(PropertyFactoryUtil.forName("sex").eq(Boolean.FALSE));   
  5. query.add(PropertyFactoryUtil.forName("authorId").in(subQuery));   
  6. return dynamicQuery(query);  

示例代码如上,等效于以下的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包,方便二次开发。

用户头像

1 条留言  访客:1 条  博主:0 条

  1. 胡总辛苦了,谢谢,原来一直搞不懂如何写自定义sql,现在解决了。 😆

给我留言取消回复

您必须 登录 才能发表留言!

Copyright © IT人生录 保留所有权利.   主题设计 知更鸟 滇ICP备16001547号

用户登录

分享到: