Spring Data JPA中使用Example进行动态查询

  Spring Data JPA中使用Example进行动态查询主要涉及:实体对象、ExampleMatcher和Example等三种类类型。基于实例的动态查询所包含的三要素如下:
1、实体对象:在ORM框架中与Table对应的域对象,一个对象代表数据库表中的一条记录,如上例中User对象,对应user表。在构建查询条件时,一个实体对象代表的是查询条件中的“数值”部分。如:要查询姓“X”的客户,实体对象只需要存储条件值“X”。

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

3、实例:即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复杂查询

SpringDataJpa之Pageable+ExampleMatcher进行分页多条件查询


————————————————
版权声明:本文为CSDN博主「Moshow郑锴」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/moshowgame/article/details/80282813

posted @   rainbow70626  阅读(2036)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
历史上的今天:
2021-04-17 springboot的Web项目编译运行时提示错误:Field userService in com.cetc.UserManger.controller.UserController required a bean of type 'com.cetc.UserManger.service.UserService' that could not be found.
2021-04-17 创建springboot项目时出现Selected Java version 11 is not supported by SDK (maximum 8)
2021-04-17 Visual Studio Code启动时总是提示“Code安装似乎损坏。请重新安装。”、标题栏显示“不受支持”等信息的解决办法
2018-04-17 VC++中出现stack overflow错误时修改VC++的默认堆栈大小
点击右上角即可分享
微信分享提示