Spring Boot Jpa之构建动态SQL查询语句_spring boot jpa predicate_江湖人称黑哥的博客-程序员宅基地

技术标签: java  mysql  springboot  

Spring Boot Jpa之构建动态SQL查询语句

引入依赖包:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

DAO接口继承JpaSpecificationExecutor。

该接口允许基于JPA标准的API规范的运行。

开始构建动态where子句要实现Specification接口的
Predicate toPredicate(Root root, CriteriaQuery<?> query, CriteriaBuilder cb);方法,该接口是领域驱动设计意义上的规范:

private Specification<ExportSubsidyPersonnel> getWhereClause(final long userId, final String agency, final Date startDate, final Date endDate,
                                                                 final String jobLevel, final String certificateGrade, final String remark) {
    
        return new Specification<ExportSubsidyPersonnel>() {
    
            @Override
            public Predicate toPredicate(Root<ExportSubsidyPersonnel> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
    
                Predicate predicate = criteriaBuilder.conjunction();
                predicate.getExpressions().add(
                        criteriaBuilder.and(root.<UserInfo>get("userInfo").in(userId))
                );
                if (!StringUtils.isEmpty(agency)) {
    
                    predicate.getExpressions().add(
                            criteriaBuilder.and(root.<String>get("agency").in(agency)));
                }
                predicate.getExpressions().add(
                        criteriaBuilder.between(root.<Date>get("time"), startDate, endDate)
                );
                if (!StringUtils.isEmpty(jobLevel)) {
    
                    predicate.getExpressions().add(
                            criteriaBuilder.and(root.<String>get("jobLevel").in(jobLevel)));
                }
                if (!StringUtils.isEmpty(certificateGrade)) {
    
                    predicate.getExpressions().add(
                            criteriaBuilder.and(root.<String>get("certificateGrade").in(certificateGrade)));
                }
                if (!Const.UNLIMITED.equals(remark)) {
    
                    predicate.getExpressions().add(
                            criteriaBuilder.and(root.<String>get("remark").in(remark)));
                }
                return predicate;
            }
        };
    }

CriteriaBuilder接口用来构建Predicate,而Predicate接口用来连接子句,每次添加到predicate之前都要进行参数非空判断。

其中Root接口代表where子句的引用类型,如,

root.get(“userInfo”).in(userId),其中是ExportSubsidyPersonnel持有userInfo的属性,并且注解如下:

@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumn(name = "userId")
private UserInfo userInfo;

in方法参数的userId即注解时的列名。相当于sql语法的in关键字。

CriteriaBuilder接口其中还包括equal等常用方法,对应sql语法的=。该接口用于构建标准查询,复合选择,表达式,谓词,排序。

最后将getWhereClause方法作为参数传入到被调用的方法中即可,如:

	Page<ExportSubsidyPersonnel> exportSubsidyPersonnelPage = exportSubsidyPersonnelService
                .querySubsidyPersonnelDetailed(getWhereClause(userId, agency, startDate, endDate, jobLevel,
                        certificateGrade, remark));

输出语句形如:

select
        count(exportsubs0_.id) as col_0_0_ 
    from
        export_subsidy_personnel exportsubs0_ 
    where
        (
            exportsubs0_.training_agency in (
                ?
            )
        ) 
        and (
            exportsubs0_.time between ? and ?
        ) 
        and (
            exportsubs0_.remark in (
                ?
            )
        )

以上。

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

智能推荐

嵌入式Linux 轻松安装jpeg库,坑已踩,直接指路,附所有依赖包_install [email protected]_hujie119120的博客-程序员宅基地

首先在你的ubuntu虚拟机上下载三个库,m4,libtool,jpge,已为你下载好,传送门:然后把m4库安装到你的ubuntu上面,直接./configure, make, make install即可,此处无脑操作。然后libtool,就需要交叉编译了,方法如下,注意红色部分,编译器和路径用你自己的./configure CC=arm-linux-gnueabihf-gcc LD=arm-linux-gnueabihf-ld --prefix=/hom...

强化学习第二章总结: e-greedy算法,梯度上升算法,the 10-armed bandit problem_ningzian的博客-程序员宅基地

学习强化学习《Reinforcement Learning An Introduction》,总结第二章的知识,包含一个问题,两个算法。问题:the 10-armed bandit problem算法:e-greedy、剃度上升仿真代码见附带资料:the 10-armed bandit problem1. 问题描述:the 10-armed bandit problem这是一个重复做选择...

报错出现:Blocked a frame with origin "null" from accessing a cross-origin frame._yunchong_zhao的博客-程序员宅基地

1.我在调试程序的时候 因为之前一样的代码 不会报错这次竟然会报错了 后来发现 俩次运行的环境不一样一个我是在vscode中的 live server中运行 另一次直接偷懒了 鼠标直接点击了文件 然后就出现了这个问题这个是因为 我在一个页面中使用iframe 引进了 另一个html文件 然后直接鼠标点击打开存在iframe的那个html文件 就会出现这样错误意思是不能本地打...

快速查看chrome浏览器中保存的密码_chrome://settings/passwords_winfredzhang的博客-程序员宅基地

1、在chrome浏览器的地址栏中输入:“chrome://settings/passwords”2、点击需要查看的密码:红圈中的图标。3、输入本机密码:”4、显示密码:

Matlab调用Python读取Abaqus模型操作_用matlab通过python 启动abaqus提示非cae文件_善水输出端的博客-程序员宅基地

前言: 在工程有限元软件中,abaqus因为强大的软件建模与云图分析,再加上其内核语言及接口都是使用简单上手的脚本语言python进行的编写,而受到广泛的运用,但对计算输出结果数据没有提供很好的访问和处理;而MATLAB语言是一门工程数学分析计算的强大工具语言,擅长对矩阵和向量的处理而受到青睐。同时呢MATLAB在机器学习等领域也是有着得天独厚的优势。进入主题: 今天我根据自己的实际学习过

小呆学数据分析——使用pandas中的merge函数进行数据集合并_努力的骆驼的博客-程序员宅基地

数据集合并应用场景数据集合并在日常工作经常遇到,典型的如将两次具有不同调查项目的结果进行合并,或者将不同调查员的同样调查项目的内容进行合并。例子王小呆一天被交代一项任务,将公司从不同渠道拿到的两个资料本(一个电话本,一个是其他资料,其中姓名有重叠)整理成一个电话本交给营销部以便更好推销。于是小呆打开资料本A.csv、B.csv看了内容:资料本A:姓名手机号固话张晓...

随便推点

选择OA办公系统,这样做,竟是陷入了巨坑?_liyi_hz2008的博客-程序员宅基地

​一个企业成功应用OA办公系统,离不开OA厂商和用户的共同努力。俗话说:一个良好的开头是成功的一半,在OA系统的实施中,OA系统的选择就是极其重要的“首环”。很多客户在选择OA办公系统时,因为缺乏相关的经验,就容易被厂家的宣传牵着鼻子走,在OA的选择上常常“冲动选择”,在后续的实施上会带来一定的负面影响。一款OA办公系统的成功应用,需要建立在正确的OA选型之上。接下来我们就来谈谈何为“不合理”的OA选型方式:一、选择恶意价格战的OA办公系统人们在购物的时候,总是追求“物美价廉”,我们的用户在

linux添加环境变量的方法总结_linux怎么添加环境变量_陌上西风听雨的博客-程序员宅基地

linux对环境变量有无双引号、或者变量用不用{}括起来并不敏感,小小的看了下profile文件,似乎系统如果发现变量没有引号,会自动加上。 但变量前必须加$符号 有以下三种添加环境变量的方法 1、直接使用export命令: 比如:export PATH=$PATH:/home/lm/apache-jena-2.7.4/binexport CLASSPATH=.:/home/liaomen

2020 年最具潜力的 44 个顶级开源项目_喜欢打酱油的老鸟的博客-程序员宅基地

来源:AI开发者本文约为7600字,建议阅读10分钟本文给开发者提供了详细的各领域工具并整理了清单11 种极具潜力的 AI 工具类型。工欲善其事必先利其器,这也是大部分开发者在日常工作中最重要开发原则。选择与开发内容相匹配的工具,常常会使我们事半功倍。但面对人工智能的多个领域,如:机器学习、深度学习、NLP等等,多样的工具有时也让我们也无从选择。就在最近,一个基于 javascri...

maven通过命令行为SpringBoot项目打包_风云正的博客-程序员宅基地

maven通过命令行为SpringBoot项目打包 一、maven通过命令行打jar包进入项目目录,执行如下命令:mvn -Dmaven.test.skip -U clean package发现报如下错误:[ERROR] Failed to execute goal org.springframework.boot:spri...

Elasticsearch多master配置及x-pack破解_elasticsearch 7.9.3配置x-pack_wangpei1949的博客-程序员宅基地

x-pack是ELK的一个插件,集监控、权限、告警等于一体。支持集群级别、节点级别、索引级别的监控;支持索引、字段级别的权限控制。x-pack目前并不开源,试用期一个月。本着自用方便,尝试破解,如在生产环境下,请尊重版权,购买正版!结点规划 节点 角色 node1 master-1、x-pack node2 data-1、x-pack no...

width和max-width_泡泡泡的博客-程序员宅基地

width为宽度max-width为最大宽度如果设置了width,那宽度就定死了而设置了max-width,实际宽度可以在0~max-width之间,当元素内部宽度不足max-width时,外层元素的宽度随内层元素宽度改变何时用max-width要看需求,如果极其简单的布局width是够了

推荐文章

热门文章

相关标签