QueryChain - 链路查询
说明
QueryChain 是 一个链路式查询类,它可以构建任意复杂的查询!!!
实例
java
SysUserRoleVo sysUserRoleVo = QueryChain.of(sysUserMapper)
.select(SysUser.class,SysRole.class)
.from(SysUser.class)
.join(SysUser::getRole_id,SysRole::getId)
.eq(SysUser::getId,1)
.like(SysUser::getUserName,"abc")
.groupBy(SysUser::getId)
.having(SysUser::getId,c->c.count().gt(0))
.orderBy(SysUser::getId)
.returnType(SysUserRoleVo.class)
.get();forSearch() :拼接where时,忽略null 、空字符、字符串trim 等
xbatis 默认不对 null 、空字符 进行处理,这是一种安全的设计
QueryChain 默认 null 会报空指针,然后 空字符也不会忽略,也不会字符串trim,一般情况下也是不需要 忽略的;
但是当你在搜索的场景下时,是需要忽略这些条件,所以设计了 forSearch()方法
forSearch()方法其实是由3个方法组成的,也可以分开设置:
java
SysUser sysUser = QueryChain.of(sysUserMapper)
// 忽略 null 条件参数
// 忽略 空字符串 条件参数
// 对字符串进行trim 去空格操作
.forSearch(true);等同于:
java
SysUser sysUser = QueryChain.of(sysUserMapper)
// 忽略 null 条件参数
.ignoreNullValueInCondition(true)
// 忽略 空字符串 条件参数
.ignoreEmptyInCondition(true)
// 对字符串进行trim 去空格操作
.trimStringInCondition(true);也可以手动进行生效处理:
java
Integer id= XXX;
String userName= YYY;
SysUser sysUser = QueryChain.of(sysUserMapper)
.select(SysUser.class,SysRole.class)
.from(SysUser.class)
.eq(SysUser::getId,id,Objects::nonNull)
.like(SysUser::getUserName,userName,StringUtils::isNotBlank)
.get();或
java
Integer id= XXX;
String userName= YYY;
SysUser sysUser = QueryChain.of(sysUserMapper)
.select(SysUser.class,SysRole.class)
.from(SysUser.class)
.eq(Objects.nonNull(id),SysUser::getId,id)
.like(StringUtils.isNotBlank(userName),SysUser::getUserName,userName)
.get();returnType(class) - 映射类
结果对应的类;可实体类,VO,Map
returnMap() - 映射Map类
映射成Map<String,V>
查询方法
get():单个查询list():列表查询cursor():列表游标查询count():count查询exists( ):exists boolean查询paging(Pager):分页查询mapWithKey(字段):把列表转成一个Map<KEY,对象>,KEY为指定字段的值
select
select(VO.class):自动select所需的列(推荐)select(实体类.class):自动实体类里列(推荐)select(实体类.get字段):select实体类字段的列select(实体类.get字段,Function):select实体类字段的列,同时提供一个Function,包装列;例如 对列进行数据库函数处理selectIgnore(实体类.get字段):忽略select实体类字段的列
from
from(实体类.class):from 实体类的表from(实体类.class,...,实体类N.class):from 多个实体类的表from(SubQuery):from 一个子查询
join
join/innerJoin/leftJoin/rightJoin(主实体类::getId,次实体类::getId):最简单的join方式(不推荐)join/innerJoin/leftJoin/rightJoin(主实体类.class,次实体类.class,ON):需要自己设置ON条件join(JoinMode,主实体类.class,次实体类.class):选择JOIN的方式例如INNER LEFT RIGHT,自行添加ON条件(旧方法,不推荐)join/innerJoin/leftJoin/rightJoin(主实体类.class,次实体类.class):结合@ForeignKey 可以不写ON条件(旧方法,不推荐)join(JoinMode,主实体类.class,次实体类.class):选择JOIN的方式例如INNER LEFT RIGHT,结合@ForeignKey 可以不写ON条件(旧方法,不推荐)
where
eq:等于ne:不等于gt:大于lt:小于gte:大于等于lte:小于等于in:INnot:NOT INisNull:IS NULLisNotNull:IS NOT NULLempty:是空字符notEmpty:非空字符like:LIKEnotLike:NOT LIKEbetween:BETWEENnotBetween:NOT BETWEENexists:EXISTSnotExists:NOT EXISTS
null ,空值等 忽略
eq(StringUtils.isNotBlank(值),SysUser:getUserName,值)
eq(SysUser:getUserName,值,StringUtils::isNotBlank)
and 或 or 切换
and():切换为AND 拼接,默认都是AND拼接;切换后,后续都是AND拼接or():切换为OR 拼接;切换后,后续都是OR拼接
and 或 or 一个子条件
andNested(Consumer<ConditionChain>):AND 一个子条件,会用括号包裹子查询orNested(Consumer<ConditionChain>):OR 一个子条件,会用括号包裹子查询
groupBy
groupBy(实体类.get字段):groupBy实体类字段的列groupBy(多个 实体类.get字段):groupBy多个实体类字段的列groupBy(实体类.get字段,Function):groupBy实体类字段的列,同时提供一个Function,包装列;例如 对列进行数据库函数处理groupBy(GetterFields.of(多个 实体类.get字段),Function):groupBy实体类字段的列,同时提供一个Function,包装列;例如 对列进行数据库函数处理
having
having(实体类.get字段,Function):groupBy实体类字段的列,同时提供一个Function,转成条件
orderBy
orderBy(实体类.get字段):orderBy实体类字段的列,ASC排序方式orderBy(多个 实体类.get字段):orderBy多个实体类字段的列,ASC排序方式orderBy(实体类.get字段,Function):orderBy实体类字段的列,同时提供一个Function,包装列;例如 对列进行数据库函数处理orderBy(GetterFields.of(多个 实体类.get字段),Function):orderBy实体类字段的列,同时提供一个Function,包装列;例如 对列进行数据库函数处理orderBy(IOrderByDirection,实体类.get字段):orderBy实体类字段的列,IOrderByDirection是排序方式orderBy(IOrderByDirection,多个 实体类.get字段):orderBy多个实体类字段的列,ASC排序方式,IOrderByDirection是排序方式orderBy(IOrderByDirection,实体类.get字段,Function):orderBy实体类字段的列,同时提供一个Function,包装列;例如 对列进行数据库函数处理orderBy(IOrderByDirection,GetterFields.of(多个 实体类.get字段),Function):orderBy实体类字段的列,同时提供一个Function,包装列;例如 对列进行数据库函数处理
