Skip to content

QueryChain - 链路查询

说明

QueryChain 是 一个链路式查询类,它可以构建任意复杂的查询!!!

实例

java
SysUserRoleVo sysUserRoleVo = QueryChain.of(sysUserMapper)
    .select(SysUser.class,SysRole.class)
    .from(SysUser.class)
    .join(SysUser.class, SysRole.class,on->on.eq(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 等

mybatis-mp 默认不对 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,Object>

returnMap(vClass) - 映射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(主实体类.class,次实体类.class):结合@ForeignKey 可以不写ON条件(推荐)
  • join(JoinMode,主实体类.class,次实体类.class):选择JOIN的方式例如INNER LEFT RIGHT,结合@ForeignKey 可以不写ON条件(推荐)
  • join(主实体类.class,次实体类.class,ON):自行添加ON条件
  • join(JoinMode,主实体类.class,次实体类.class):选择JOIN的方式例如INNER LEFT RIGHT,自行添加ON条件

where

  • eq:等于
  • ne:不等于
  • gt:大于
  • lt:小于
  • gte:大于等于
  • lte:小于等于
  • in:IN
  • not:NOT IN
  • isNull:IS NULL
  • isNotNull:IS NOT NULL
  • empty:是空字符
  • notEmpty:非空字符
  • like:LIKE
  • notLike:NOT LIKE
  • between:BETWEEN
  • notBetween:NOT BETWEEN
  • exists:EXISTS
  • notExists: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多个实体类字段的列
  • groupByselect(实体类.get字段,Function):groupBy实体类字段的列,同时提供一个Function,包装列;例如 对列进行数据库函数处理

having

  • having(实体类.get字段,Function):groupBy实体类字段的列,同时提供一个Function,转成条件

orderBy

  • orderBy(实体类.get字段):orderBy实体类字段的列,ASC排序方式
  • orderBy(多个 实体类.get字段):orderBy多个实体类字段的列,ASC排序方式
  • orderByselect(实体类.get字段,Function):orderBy实体类字段的列,同时提供一个Function,包装列;例如 对列进行数据库函数处理
  • orderBy(IOrderByDirection,实体类.get字段):orderBy实体类字段的列,IOrderByDirection是排序方式
  • orderBy(IOrderByDirection,多个 实体类.get字段):orderBy多个实体类字段的列,ASC排序方式,IOrderByDirection是排序方式
  • orderByselect(IOrderByDirection,实体类.get字段,Function):orderBy实体类字段的列,同时提供一个Function,包装列;例如 对列进行数据库函数处理