文章目录
前言
最近在使用spring+jpa写一个项目,有一个需求是列表筛选,而且是可选的筛选项,如果传null就代表全选,由于是需要连接两张表查询且两张表字段都要用到,因此一般的Specification并做不到,选择了写nativeQuery的办法,所以需要在sql中进行判断。
实现
等于,大于,小于筛选条件
使用sql的if语句,如下
and if (:XXX is not null,xxx=:XXX,1=1)
xxx为mysql字段名,XXX为JPA函数的传入值,如果为空的化就采用了1=1
in筛选条件
之前的=并不适用于in,如果这么写
and if (:XXX is not null,xxx in :XXX,1=1)
会报错,因为如果是null的化sql语句就变成了
and if(null is not null,xxx in null,1=1)
其中的xxx in null不符合mysql的语法,因此需要换一个语句
and (coalesce (:XXX, null) is null or xxx in (:XXX))
这样就可以将数组传进去了
小结
说是JPA,其实就是mysql的if用法,灵活应用后可以省去一定的代码量