本文节选自《疯狂工作流讲义(第2版)》
京东购买地址:https://item.jd.com/12246565.html
工作流Activiti6电子书:http://blog.csdn.net/boxiong86/article/details/78488562
工作流Activiti6教学视频:http://blog.csdn.net/boxiong86/article/details/78608585
Activiti数据查询
本章要点
Activiti的数据查询、排序机制
排序方法
Query中提供了asc和desc方法,这两个方法可以设置查询结果的排序方式,但是调用这两个方法的前提是,必须告诉Query对象,是按何种条件进行排序,例如要按照ID排序,就要调用相应查询对象的orderByXXX方法。例如GroupQuery的orderByGroupId、orderByGroupName等方法,如果不调用这些方法而直接使用asc或者desc方法,则会抛出ActivitiException,异常信息为:You should call any of the orderBy methods first before specifying a direction。要求Activiti进行排序,却不告诉它以哪个字段进行排序,因此会抛出该异常。代码清单6-7中调用asc和desc方法。
代码清单6-7:codes\06\6.2\sort-data\src\org\crazyit\activiti\Sort.java
public static void main(String[] args) {
//创建流程引擎
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
//得到身份服务组件实例
IdentityService identityService = engine.getIdentityService();
//写入5条用户组数据
createGroup(identityService, UUID.randomUUID().toString(), "1", "typeA");
createGroup(identityService, UUID.randomUUID().toString(), "2", "typeB");
createGroup(identityService, UUID.randomUUID().toString(), "3", "typeC");
createGroup(identityService, UUID.randomUUID().toString(), "4", "typeD");
createGroup(identityService, UUID.randomUUID().toString(), "5", "typeE");
//调用orderByGroupId和asc方法,结果为按照ID升序排序
System.out.println("asc排序结果:");
List<Group> datas = identityService.createGroupQuery().orderByGroupName().asc().list();
for (Group data : datas) {
System.out.println(" " + data.getId() + "---" + data.getName());
}
System.out.println("desc排序结果");
//调用orderByGroupName和desc方法,结果为名称降序排序
datas = identityService.createGroupQuery().orderByGroupName().desc().list();
for (Group data : datas) {
System.out.println(" " + data.getId() + "---" + data.getName());
}
}
//将用户组数据保存到数据库中
static void createGroup(IdentityService identityService, String id,
String name, String type) {
//调用newGroup方法创建Group实例
Group group = identityService.newGroup(id);
group.setName(name);
group.setType(type);
identityService.saveGroup(group);
}
代码清单6-7中,调用了asc和desc方法(代码清单中的粗体部分),输出的结果如下:
asc排序结果:
35987ec6-de7f-4d36-920f-71d27b586817---1
3273d754-a77f-4a7b-ac88-b529cc5e3d35---2
590f5597-d662-4c35-a35c-c2828468878d---3
f8decda9-ceb9-4172-ad61-ae3d2a8a4e8e---4
0f50f928-a7ff-4b77-b4fd-578773c0fb2f---5
desc排序结果
0f50f928-a7ff-4b77-b4fd-578773c0fb2f---5
f8decda9-ceb9-4172-ad61-ae3d2a8a4e8e---4
590f5597-d662-4c35-a35c-c2828468878d---3
3273d754-a77f-4a7b-ac88-b529cc5e3d35---2
35987ec6-de7f-4d36-920f-71d27b586817---1
注意:调用asc或者desc,只是让Query设置排序方式,orderByXXX方法、asc方法和desc方法均返回Query本身,如果需要得到最终结果集,还需要调用list或者listPage方法。
ID排序问题
在Activiti的设计中,每个数据表的主键均设计为字符型,这样的设计使得Activiti各个数据表的主键可以灵活设置,但是如果使用数字字符串作为其主键,那么按照ID排序,就会带来排序问题,请看代码清单6-8。
代码清单6-8:codes\06\6.2\sort-data\src\org\crazyit\activiti\SortProblem.java
public static void main(String[] args) {
//创建流程引擎