[Liferay6.2]Liferay Dynamic Query API示例
介绍
Liferay提供了几种方法定义复杂的查询用来检索数据库中的数据。
通常情况下,在每个service Entity中,通过定义一些'finder'方法,可以便捷地满足基本的数据查询操作。
但是,有时候我们可能会遇到以下几种finder查询并不能满足的情况:
- 过于复杂的查询,例如子查询
- 需要实现一些聚合操作,像min、max、avg等
- 想得到复合对象或元组而不是映射的对象类型
- 查询优化
- 复杂的数据访问,像报表等
要实现这个目的,就需要通过Liferay提供的Hibernate的Dynamic Query API实现。
在本文中,我们将演示如何构建不同类型的Dynamic Query并执行它们。
Dynamic Query基本语法
在Liferay中构建一个Dynamic Query基本语法的代码如下:
//构建动态查询,相当于select * from Entity_Name
DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(Entity_Name.class);
//DynamicQueryFactoryUtil.forClass(Entity_Name.class,PortalClassLoaderUtil.getClassLoader());
//设置查询列
dynamicQuery.setProjection(Projection projection);
//设置查询条件
dynamicQuery.add(Criterion criterion);
//设置排序规则
dynamicQuery.addOrder(Order order);
//设置返回结果集的范围
dynamicQuery.setLimit(int start, int end);
//执行动态查询,得到结果集
Entity_NameLocalServiceUtil.dynamicQuery(dynamicQuery);
其中,
Entity_Name:实体名称,就是service.xml中制定的Entity名称。
DynamicQuery也可以通过DynamicQuery forClass(Class<?> clazz, ClassLoader classLoader)来初始化。
Dynamic Query应用示例
1、select * from organization_;
DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(Organization.class);
List<Organization> Organizations = OrganizationLocalServiceUtil.dynamicQuery(dynamicQuery);
2、select * from organization_ where parentOrganizationId=0;
DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(Organization.class);
dynamicQuery.add(PropertyFactoryUtil.forName("parentOrganizationId").eq(0L));
List<Organization> Organizations = OrganizationLocalServiceUtil.dynamicQuery(dynamicQuery);
3、like、>、>=、<、<=、between ... and ...
// select * from organization_ where name like '组织机构%';
dynamicQuery.add(PropertyFactoryUtil.forName("parentOrganizationId").like("组织机构%"));
// select * from organization_ where organizationId >21212;
dynamicQuery.add(PropertyFactoryUtil.forName("organizationId").gt(21212L));
// select * from organization_ where organizationId >=21212;
dynamicQuery.add(PropertyFactoryUtil.forName("organizationId").ge(21212L));
// select * from organization_ where organizationId <21224;
dynamicQuery.add(PropertyFactoryUtil.forName("organizationId").lt(21224L));
// select * from organization_ where organizationId <=21224;
dynamicQuery.add(PropertyFactoryUtil.forName("organizationId").le(21224L));
// select * from organization_ where organizationId between 21212 and 21224;
dynamicQuery.add(PropertyFactoryUtil.forName("organizationId").between(21212L, 21224L));
4、and / or
// select * from organization_ where organizationId >= 21212 and organizationId <=21224;
// 第1种方法(不适用于or)
dynamicQuery.add(PropertyFactoryUtil.forName("organizationId").ge(21212L));
dynamicQuery.add(PropertyFactoryUtil.forName("organizationId").le(21224L));
// 第2种方法(适用于or,使用RestrictionsFactoryUtil.or)
Criterion criterion = null;
criterion = RestrictionsFactoryUtil.ge("organizationId", 21212L);
criterion = RestrictionsFactoryUtil.and(criterion, RestrictionsFactoryUtil.le("organizationId", 21224L));
dynamicQuery.add(criterion);
// 第3种方法(适用于or,使用RestrictionsFactoryUtil.disjunction())
Junction junction = RestrictionsFactoryUtil.conjunction();
junction.add(PropertyFactoryUtil.forName("organizationId").ge(21212L));
junction.add(PropertyFactoryUtil.forName("organizationId").le(21224L));
dynamicQuery.add(junction);
5、order by
// select * from organization_ order by organizationId asc;
dynamicQuery.addOrder(OrderFactoryUtil.asc("organizationId"));
// select * from organization_ order by organizationId desc;
dynamicQuery.addOrder(OrderFactoryUtil.desc("organizationId"));
6、子查询
// select * from organization_ where parentOrganizationId=(select organizationId from organization_ where name='组织机构1');
DynamicQuery subDynamicQuery = DynamicQueryFactoryUtil.forClass(Organization.class);
subDynamicQuery.setProjection(ProjectionFactoryUtil.property("organizationId"));
subDynamicQuery.add(PropertyFactoryUtil.forName("name").eq("组织机构1"));
dynamicQuery.add(PropertyFactoryUtil.forName("parentOrganizationId").in(subDynamicQuery));
7、自定义列
// select name from organization_;
dynamicQuery.setProjection(ProjectionFactoryUtil.property("name"));
List<Object> names = OrganizationLocalServiceUtil.dynamicQuery(dynamicQuery);
for(Object name: names){
System.out.println(name);
}
// select organizationId,name from organization_;
ProjectionList projectionList = ProjectionFactoryUtil.projectionList();
projectionList.add(ProjectionFactoryUtil.property("organizationId"));
projectionList.add(ProjectionFactoryUtil.property("name"));
dynamicQuery.setProjection(projectionList);
List<Object[]> organizations = OrganizationLocalServiceUtil.dynamicQuery(dynamicQuery);
for(Object[] organization: organizations){
System.out.println(organization[0]+":"+organization[1]);
}
8、distinct
// select distinct name from organization_;
Projection projection = ProjectionFactoryUtil.distinct(ProjectionFactoryUtil.property("name"));
dynamicQuery.setProjection(projection);
9、group by
// select type_,count(type_) from organization_ group by type_;
ProjectionList projectionList = ProjectionFactoryUtil.projectionList();
projectionList.add(ProjectionFactoryUtil.property("type"));
projectionList.add(ProjectionFactoryUtil.count("name"));
projectionList.add(ProjectionFactoryUtil.groupProperty("type"));
dynamicQuery.setProjection(projectionList);
List<Object[]> organizations = OrganizationLocalServiceUtil.dynamicQuery(dynamicQuery);
for(Object[] organization: organizations){
System.out.println(organization[0]+":"+organization[1]);
}
此外,max聚合函数调用方法如下:
max:ProjectionFactoryUtil.max(String propertyName)
其他聚合函数min、avg等可参考递推。
10、分页
// 取第1条到第10条记录
dynamicQuery.setLimit(0,10);
11、复合主键
如果实体是符合主键,我们要通过复合主键中的属性列进行查询的话,则需要在列名前面加上"primaryKey.",如下:
dynamicQuery.add(PropertyFactoryUtil.forName("primaryKey.organizationId").gt(21212L));
总结
以上只是一些基本的示例,能够解决我们在日常开发中遇到的大部分问题,此外Dynamic Query API也提供了一些更高级的扩展方法(eqAll、geAll等),这些大家就一起探索吧,以后用到再更新。
通过以上示例,我们可以看到Liferay提供的Dynamic Query API,其实就是通过一组java方法来组成SQL语句,执行并获得结果。可能有些朋友会觉得这种方法太过于繁琐,还不如直接写SQL来得方便直接。但是站在平台数据库兼容性的角度考虑,我们就会发现这种方式非常合适。因为liferay支持mysql、oracle、db2等多种数据库,如果直接写SQL的话,很可能碰到其他数据库的语法不支持的情况发生,像oracle中的递归查询mysql就不支持等。使用Dynamic Query API的话,我们就可以使用一套统一的语法来构建SQL语句,而不需要考虑底层数据库的差异,这样整个平台的移植性和兼容性就显著提高了很多。
[Liferay6.2]Liferay Dynamic Query API示例的更多相关文章
- [Liferay6.2]Liferay入门级portlet开发示例
什么是Portlet 来自百度百科(http://baike.baidu.com/view/58961.htm)的定义如下: portlet是基于java的web组件,处理request并产生动态内容 ...
- Mybatis Dynamic Query 2.0 入门
简介 2.0 昨天打包好了,主要是整合了tk.mybatis.mapper 到项目中去,所以和1.x比起来主要多了一个通用mapper.因为作者主要是使用springboot 这里讲一下Springb ...
- elasticsearch6.7 05. Document APIs(7)Update By Query API
6.Update By Query API _update_by_query 接口可以在不改变 source 的情况下对 index 中的每个文档进行更新.这对于获取新属性或其他联机映射更改很有用.以 ...
- elasticsearch 基础 —— Update By Query API
Update By Query API 最简单的用法是_update_by_query在不更改源的情况下对索引中的每个文档执行更新.这对于获取新属性或其他一些在线映射更改很有用 .这是API: POS ...
- 百度地图API示例之设置级别setZoom与禁止拖拽disableDragging
百度地图API示例之设置级别setZoom与禁止拖拽disableDragging 设置级别 <html> <head> <meta http-equiv="C ...
- Mybatis Dynamic Query 框架整合
项目地址:https://github.com/wz2cool/mybatis-dynamic-query 文档地址:https://wz2cool.gitbooks.io/mybatis-dynam ...
- Mybatis Dynamic Query 1.0.2版本
项目地址:https://github.com/wz2cool/mybatis-dynamic-query 文档地址:https://wz2cool.gitbooks.io/mybatis-dynam ...
- Mybatis Dynamic Query 2.0.2
项目地址:https://github.com/wz2cool/mybatis-dynamic-query 文档地址:https://wz2cool.gitbooks.io/mybatis-dynam ...
- elasticsearch6.7 05. Document APIs(5)Delete By Query API
4.Delete By Query API _delete_by_query API可以删除某个匹配条件的文档: POST twitter/_delete_by_query { "query ...
随机推荐
- offset求结构体成员的偏移量
[代码] C++ Code 12345678910111213141516171819202122232425262728293031 /* version: 1.0 author: hell ...
- NSIS脚本入门和进阶方法
NSIS(Nullsoft Scriptable Install System)是一个开源的 Windows 系统下安装程序制作程序.它提供了安装.卸载.系统设置.文件解压缩等功能.对于新手来说,它有 ...
- bbs/贴吧/盖楼的技术实现(PHP)
2015年3月5日 14:36:44 更新: 2015年7月18日 16:33:23 星期六 目标, 实现类似网易盖楼的功能, 但是不重复显示帖子 效果: * 回复 //1楼 ** 回复 //1楼的子 ...
- codeforces Good Bye 2015 B. New Year and Old Property
题目链接:http://codeforces.com/problemset/problem/611/B 题目意思:就是在 [a, b] 这个范围内(1 ≤ a ≤ b ≤ 10^18)统计出符合二进制 ...
- ORACLE 远程导入导出数据库
Oracle数据导入导出imp/exp就相当于oracle数据还原与备份.exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处的数据库服务器中. ...
- Spring Data JPA初使用(转载)
我们都知道Spring是一个非常优秀的JavaEE整合框架,它尽可能的减少我们开发的工作量和难度. 在持久层的业务逻辑方面,Spring开源组织又给我们带来了同样优秀的Spring Data JPA. ...
- Android Volley入门到精通:定制自己的Request
经过前面两篇文章的学习,我们已经掌握了Volley各种Request的使用方法,包括StringRequest.JsonRequest.ImageRequest等.其中StringRequest用于请 ...
- 【python】list,dict赋值不要用等号,要用extend,update
如果有一个list,我们用连等号的方式赋值 c = d = [1], 则当c改变时,d同样会改变.字典同理 正确做法应该是: d = [1] c = [1] 或者 d = [1] c.extend(d ...
- 修改VS2010生成的dll文件中的内容
我的电脑是64为的操作系统,所以先找到下面的路径 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin 找到这个文件:ildasm.exe,如 ...
- [Android Pro] ActionBarDrawerToggle 使用小结
reference to : http://blog.csdn.net/chencehnggq/article/details/21492417 activity.java mToolbar = ( ...