SpingDataJPA之ExampleMatcher实例查询

ExampleMatcher是SpingData-JPA中好玩的一个东西

ExampleMatcher实例查询三要素

  • 实体对象:在ORM框架中与Table对应的域对象,一个对象代表数据库表中的一条记录,如上例中User对象,对应user表。在构建查询条件时,一个实体对象代表的是查询条件中的“数值”部分。如:要查询姓“X”的客户,实体对象只需要存储条件值“X”。

  • 匹配器:ExampleMatcher对象,它是匹配“实体对象”的,表示了如何使用“实体对象”中的“值”进行查询,它代表的是“查询方式”,解释了如何去查的问题。如:要查询姓“X”的客户,即姓名以“X”开头的客户,该对象就表示了“以某某开头的”这个查询方式,如上例中:withMatcher(“userName”, GenericPropertyMatchers.startsWith())

  • 实例:即Example对象,代表的是完整的查询条件。由实体对象(查询条件值)和匹配器(查询方式)共同创建。最终根据实例来findAll即可。

  • -
    /**
     * 查询失物招领信息
     * @return
     */
    @GetMapping("/lost/list")
    public ApiReturnObject findAllLostProperty (String materialName,Timestamp registerTime,String status) {
        LostProperty obj=new LostProperty();
        obj.setMaterialName(materialName);
        obj.setRegisterTime(registerTime);
        obj.setStatus(status);
        //创建匹配器,即如何使用查询条件
        ExampleMatcher matcher = ExampleMatcher.matching() //构建对象
                .withMatcher("materialName", GenericPropertyMatchers.contains()) //姓名采用“开始匹配”的方式查询
                .withMatcher("registerTime", GenericPropertyMatchers.contains()) //姓名采用“开始匹配”的方式查询
                .withMatcher("status", GenericPropertyMatchers.contains()) //姓名采用“开始匹配”的方式查询
                .withIgnorePaths("id");  //忽略属性:是否关注。因为是基本类型,需要忽略掉

        //创建实例
        Example<LostProperty> ex = Example.of(obj, matcher); 
        //查询
        List<LostProperty> ls = lostPropertyRespository.findAll(ex);

        return ApiReturnUtil.success(ls);
    }

查询状态为0的全部
这里写图片描述
查询状态为0,且名字为手机的
这里写图片描述

Matching生成的语句说明

  • DEFAULT (case-sensitive) firstname = ?0 默认(大小写敏感)
  • DEFAULT (case-insensitive) LOWER(firstname) = LOWER(?0) 默认(忽略大小写)
  • EXACT (case-sensitive) firstname = ?0 精确匹配(大小写敏感)
  • EXACT (case-insensitive) LOWER(firstname) = LOWER(?0) 精确匹配(忽略大小写)
  • STARTING (case-sensitive) firstname like ?0 + ‘%’ 前缀匹配(大小写敏感)
  • STARTING (case-insensitive) LOWER(firstname) like LOWER(?0) + ‘%’ 前缀匹配(忽略大小写)
  • ENDING (case-sensitive) firstname like ‘%’ + ?0 后缀匹配(大小写敏感)
  • ENDING (case-insensitive) LOWER(firstname) like ‘%’ + LOWER(?0) 后缀匹配(忽略大小写)
  • CONTAINING (case-sensitive) firstname like ‘%’ + ?0 + ‘%’ 模糊查询(大小写敏感)
  • CONTAINING (case-insensitive) LOWER(firstname) like ‘%’ + LOWER(?0) + ‘%’ 模糊查询(忽略大小写)

后话

使用一段时间之后,发现ExampleMatcher对日期的查询很不友好,不支持动态查询的,所以有了接下来研究的Specification复杂查询,可以了解一下。

SpringDataJpa之Specification复杂查询
https://blog.csdn.net/moshowgame/article/details/80309642

SpringDataJpa之Pageable+ExampleMatcher进行分页多条件查询
https://blog.csdn.net/moshowgame/article/details/80650641

  • 16
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
查询 Activiti 中的流程实例数据,可以通过以下步骤进行操作: 1. 获取 Activiti 引擎实例。 ```java ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); ``` 2. 获取历史服务实例。 ```java HistoryService historyService = processEngine.getHistoryService(); ``` 3. 使用 `createHistoricProcessInstanceQuery()` 方法创建一个历史流程实例查询对象。 ```java HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery(); ``` 4. 设置查询条件。 例如,可以通过 `processDefinitionId()` 方法设置流程定义 ID: ```java query.processDefinitionId(processDefinitionId); ``` 或者,可以通过 `processInstanceId()` 方法设置流程实例 ID: ```java query.processInstanceId(processInstanceId); ``` 5. 调用 `list()` 方法获取查询结果。 ```java List<HistoricProcessInstance> processInstances = query.list(); ``` 6. 遍历查询结果,获取流程实例数据。 ```java for (HistoricProcessInstance processInstance : processInstances) { // 获取流程实例 ID String processInstanceId = processInstance.getId(); // 获取流程定义 ID String processDefinitionId = processInstance.getProcessDefinitionId(); // 获取流程实例开始时间 Date startTime = processInstance.getStartTime(); // 获取流程实例结束时间 Date endTime = processInstance.getEndTime(); // 获取流程实例持续时间 long durationInMillis = processInstance.getDurationInMillis(); // 获取流程实例状态 String state = processInstance.getState(); // 其他属性... } ``` 以上就是查询 Activiti 中流程实例数据的基本流程。根据具体需求,可以设置不同的查询条件和获取不同的流程实例属性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值