Spring Data JPA实现分页多条件查询2_jpa分页_yogima的博客-程序员宅基地

技术标签: spring  ExampleMatcher  jpa  SSM  分页查询  

之前写过一篇博客
Spring Data JPA 使用JpaSpecificationExecutor实现多条件查询(分页查询和非分页查询)

然后发现还有其他两种写法,会更简便一些。

1、使用JPA自带的findByXxx接口
这种方法其实还比较方便,除了如果字段多的话findByXxx这个方法的名字会很长很长很长…
Containing的用法与like一致.

示例:
顺便说明一下default方法:
在java8以后,接口中可以添加使用default或者static修饰的方法,在这里我们只讨论default方法,default修饰方法只能在接口中使用,在接口中被default标记的方法为普通方法,可以直接写方法体。
实现类会继承接口中的default方法。

@Repository
public interface UserRepository extends JpaRepository<UserDO,Long> {
    

    Page<UserDO> findByUsernameContainingAndUserPasswordContaining(String username, String password, Pageable pageable);

    default Page<UserDO> searchUserByCondition(String username, String password, Pageable pageable){
    
        if(username == null){
    
            username = "";
        }
        if(password == null){
    
            password = "";
        }
        return findByUsernameContainingAndUserPasswordContaining(username, password, pageable);
    }

}

写个类测试一下:
注意要加上注解@RunWith(SpringRunner.class),有了这个注解@Autowired注入的类才能实例化到spring容器中,自动注入才能生效,如果不加这一行会报错NullPointerExecption.

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserTest {
    

    @Autowired
    private UserRepository userRepository;

    @Test
    public void Test1(){
    
        UserDO userDO = new UserDO();
        userDO.setUsername("yogi");
        userDO.setUserPassword("123456");
        userRepository.saveAndFlush(userDO);

        List<UserDO> userDOList = userRepository.searchUserByCondition("yog",null, PageRequest.of(0,10)).getContent();

        System.out.println(userDOList.size());
    }

}

2、使用ExampleMatcher

@Repository
public interface UserRepository extends JpaRepository<UserDO,Long> {
    

    default Page<UserDO> searchUserByCondition2(UserDO userDO, Pageable pageable){
    
        if (StringUtils.isEmpty(userDO.getUserPassword())) {
    
            // 对于数据库中允许为空的字段,需要设置null值,否则传入双引号会被判断成有值
            userDO.setUserPassword(null);
        }
        ExampleMatcher matcher = ExampleMatcher.matching()
                .withIgnoreNullValues()
                .withIgnoreCase(false)
                .withMatcher("username", ExampleMatcher.GenericPropertyMatchers.contains())
                .withMatcher("userPassword", ExampleMatcher.GenericPropertyMatchers.contains())
                .withIgnorePaths("userId", "userPhone");//忽略属性
        Example<UserDO> userDOExample = Example.of(userDO, matcher);
        return this.findAll(userDOExample,pageable);
    }

}

方法如下:

方法 含义
caseSensitive() 大小写敏感
ignoreCase() 忽略大小写
contains() 模糊匹配,%{str}%
startsWith() 匹配起始字符串,{str}%
endsWith() 匹配结尾字符串,%{str}
exact() 精确匹配字符串
reges() 将字符串作为正则表达式进行匹配

注意一下当使用完全匹配.exact()时,参数为String类型时,传参时如果传""(空字符串),并不是不进行筛选,而是会筛选"",结果极有可能查询结果为空。
要解决这个问题,也可以在之前对需要完全匹配的属性做出如下设置:

if (StringUtils.isEmpty(userDO.getXxx())) {
    
    userDO.setXxx(null);
}

此时该属性需要完全匹配,并当传入""时会不进行筛选,而是查出全部。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yogima/article/details/115375577

智能推荐

题解 最短Hamilton路径-程序员宅基地

题目链接:AcWing题目描述:给定一张 n 个点的带权无向图,点从 0~n-1 标号,每个点经过一次,求从0到n-1的最短路径题解:数据范围比较小,所以暴力也能做,但正解是贼难的位运算 Q_Q算法的核心是用一个二进制数表示一种方案对于这个数的第i位:0表示没走过,1表示走过这里的f[i][j]表示:在当前方案i中,走到了j那么状态转移方程就是f[i][j]=min(f[i][...

ant designd pro Form表单的 默认值_proformswitch_不愿透露姓名的唐马儒先生的博客-程序员宅基地

当表单 新增和修改 共用一个页面时const [form] = Form.useForm();const data = props.location.queryuseEffect(() => { form.setFieldsValue({...data}); }, []);_proformswitch

小程序的优势和劣势是什么?_关于国内开发的三个旅行小程序的实例好处及缺点_无崖子online的博客-程序员宅基地

小程序是一种不用下载就能使用的应用,也是一项门槛非常高的创新,经过将近两年的发展,已经构造了新的小程序开发环境和开发者生态。小程序越来越火爆,那么小程序的优势在哪里?欢迎找我开发小程序啊,本人经验丰富,技术牛鼻,开发过多款微信小程序,我的微信是 A1354164181,加我著名csdn有折扣哦。小程序优点:1、方便快捷,即用即走。不需要再下载什么APP啦,既费流量,又占空间内存。小程序就是方便,即用即走。2、速度快、不占内存因为小程序前端代码都是存在微信服务器上的,在腾讯云端存放呢,所以无需加载_关于国内开发的三个旅行小程序的实例好处及缺点

Vue 的三种 template 模板写法_vue option-template-程序员宅基地

目录1、Vue 完整版写法(一)2、Vue 完整版写法(二)3、Vue 非完整版 + .vue 文件1、Vue 完整版写法(一)由于 Vue 完整版的组成是由 运行时版 + 编译器,编译器可以解析 HTML 代码,所以支持将 HTML 写在 .html 文件中。<div id="app"> {{n}} <button @click="ad..._vue option-template

overlay的用法_小明永久-程序员宅基地

这里使用了ogreCore的LoadingOverlay获得Overlay:Overlay* pOverlay = OverlayManager::getSingleton().getByName("Core/LoadOverlay"); 显示Overlay:pOverlay->show(); 隐藏Overlay:pOverlay->hide(); 获得Ove_小明永久

手写SQL编译器 - Chapter 1-程序员宅基地

数据库是怎么工作的?当你打开这篇文章的时候你一定也好奇:SQL语句为什么能对数据库操作事务回滚是怎么滚的?数据是怎么被保存到硬盘里的?…接下来我们将一步步搭建一个框架并逐渐完善,并尝试着把这些问题讲明白。我选择基于 SQLite ,因为 SQLite 体积小又功能齐全,整个数据库就存储在一个文件中。我认为可以以此为起点以小见大,启发大家对数据库有更多的思考。一个 SQL 语句需要经过一连串的过程才能检索或修改数据。前端包括:tokenizer 词法解析器parser 语法解析_sql编译器

随便推点

DSP28335按键实验_狸花.的博客-程序员宅基地

1、按前述教程快速新建一个新工程,在工程文件中app文件夹下新建key子文件夹用于存放key.c/key.h文件(记得添加进头文件路径),在user/main.c编写主函数。4、main.c代码。

打开mysql core dump的方法_.suid_dumpable=2-程序员宅基地

为了诊断mysql段错误(segment fault),也被称为崩溃(crash),需要在段错误发生时生成core文件(core dump)。默认情况下,mysql core文件是不会生成的,需要提前做好一些配置工作。mysql的core dump正确打开方式如下:1、打开linux的core文件大小限制,即ulimit -c。ulimit -c unlimited如果希望core limit永久生效,需要修改 /etc/security/limits.conf 文件,并且重新._.suid_dumpable=2

拼多多微信登录服务器请求失败,拼多多管理后台登不上怎么回事?有何功能?..._爱面包的博客-程序员宅基地

拼多多商家们如果想要做好店铺的管理工作,那肯定也需要熟练拼多多管理后台,如果发现自己的后台登录不上去的情形,大家知道这是怎么回事吗?它又有哪些功能呢?1、遇到拼多多管理后台打不开的情况,可以先重启路由器试试,如还是打不开应该是网站服务器的问题,电话客服查询吧!!2、建议可以重装一下电脑系统试试看,有可能是电脑系统不支持;3.更换网页浏览器试试看,因为有些网页浏览器是不支持拼多多管理后台登陆的。4...._电脑端微信,拼多多都登不了

Linux中vim编译器作用,linux   vim编辑器总结_谢中用的博客-程序员宅基地

vim编辑器总结目录一 vi/vim 使用vi/vim 工作模式vim 的三种工作模式 普通模式 编辑模式 末行模式1.1 打开文件命令功能vim +n filename打开文件,并将光标置于第N行的行首vim + filename打开文件,并将光标置于最后一行行首vim +/pattem filename打开文件,并将光标置于第一个与patten匹配的行vim –r filename上次使用vi...

说说单片机的裸奔程序的框架(转)-程序员宅基地

从07年参加全国大学生电子设计大赛初次接触单片机开发至今已经有4年了,初学单片机时,都会纠结于其各个模块功能的应用,如串口(232,485)对各种功能IC的控制,电机控制PWM,中断应用,定时器应用,人机界面应用,CAN总线等. 这是一个学习过程中必需的阶段,是基本功。很庆幸,在参加电子设计大赛赛前培训时,MCU周围的控制都训练的很扎实。经过这个阶段后,后来接触不同的MCU就..._裸奔 框架