在上一篇的博客《Liferay 6.1开发学习(十九):Liferay ServiceBuilder之自定义查询》之中介绍了一部分简单的Dynamic Query方法,可以满足简单的条件查询,但有些场景这样的查询不能满足我们的需求,同时使用HQL可能有稍显麻烦,在这里介绍一些Dynamic Query的高级技巧。(Dynamic Query的查询持续更新到此篇博客)
在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)
在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"))))
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包,方便二次开发。
安装了JIRA 6.0.2但默认情况下是不带中文语言包的,从网上下了一些号称是中文的语言包,但是发现翻译的情况都不怎么样,而且还有大量的未翻译的情况。在搜索了一番之后,发现官方提供的有中文的语言包,现在的完成度大概为61%(自己之前还想着自己写插件呢,汗颜~)。
官方的合作翻译平台:https://translations.atlassian.com/dashboard/dashboard
点击如下图所示的位置,在弹出的页面中,点击下载语言包,会得到一个名为JIRA-6.0.2-language-pack-zh_CN.jar文件,插件的安装说明,在此下载面的下面有详细的说明。
如果对其中的某些翻译不满意,可以自己翻译,翻译的方法如下:
1、进入网址:https://translations.atlassian.com/dashboard/translate。
2、在这里选择相应的内容,在所有产品里面选择JIRA,版本选择自己想翻译的版本内容,在版本的内容是搜索框,可以用以快速的搜索想要翻译的名称。在状态那里有三种选择:进行中、接受翻译、所有条目。
进行中:简单的说就是没有翻译过的。一般要进行中文翻译的时候可以选择此条目。
接受翻译:已经翻译过的条目,如果是对某一个翻译不满意,可以选择这个状态。
所有条目:就是以上两种的综合。
3、如果翻译完成之后,可以重复第一部分讲的中文语言包的安装,或者输入https://translations.atlassian.com/dashboard/download#/JIRA/6.0.2,会看到这里的翻译为自动的打包翻译的,我们下载新的语言包,再次上传到JIRA里面,即可更新JIAR的中文语言包。