Skip to content

对象转条件

目标对象需要加上@ConditionTarget(实体类) 或者本身就是实体类

@ConditionTarget(实体类) 标记这个类的目标实体类

为什么要加这个?答:为了减少字段配置,默认是继承@ConditionTarget(实体类)的实体类

如何配置属性的查询条件类型?

默认情况下,字段有值就会自动拼接 eq行为;但是, 不是所有的条件的都是等于(eq),所以 我们需要在类上加一个注解;@Condition

@Condition 属性介绍

名称必须说明
value条件的类型,默认是EQ
target目标实体类可忽略,默认和@ConditionTarget(实体类)一样或者是当前实体类
property目标实体类的属性名,如果和实体类字段一样,则可忽略
storeysource实体类的存储层级
likeModelike的方式,左like,右like等等
toEndDayTime默认false,将日期转成到这天的最后1秒 只支持 lte 和 between的第2个参数 支持类型为LocalDate/Date/String/Long/LocalDateTime
defaultValue默认值,支持动态值;支持基本类型的默认值 支持动态默认值,也可以自定义默认值; 例如 官方的默认值 "{NOW}" "{TODAY}" "{NOW}" 支持单个时间 "{TODAY}" 时间范围(数组类型或者集合类型字段)

POJO 实例

java
import cn.xbatis.db.annotations.Condition;
import cn.xbatis.db.annotations.ConditionTarget;
import com.xbatis.core.test.DO.SysUser;
import lombok.Data;

import static cn.xbatis.db.annotations.Condition.Type.*;

@Data
@ConditionTarget(SysUser.class)
public class QueryREQ {

    private Integer id;

    @Condition(value = LIKE)
    private String userName;

    @Condition(property = SysUser.Fields.id, value = GT)
    private Integer gtId;

    @Condition(property = SysUser.Fields.id, value = GTE)
    private Integer gteId;

    @Condition(property = SysUser.Fields.id, value = LT)
    private Integer ltId;

    @Condition(property = SysUser.Fields.id, value = LTE)
    private Integer lteId;

    @Condition(property = SysUser.Fields.id, value = BETWEEN)
    private Integer[] btIds;
}

如何用?

java
    QueryREQ queryReq = new QueryREQ();
    queryReq.setId(1);
    
    Integer id = QueryChain.of(sysUserMapper)
            .where(queryReq)
            .select(SysUser::getId)
            .returnType(Integer.class)
            .get();

如何实现内嵌形式的条件,例如 id1=1 and (id2=2 or id3=3)

java
@Data
@ConditionTarget(SysUser.class)
@ConditionGroup(value = {QueryREQ.Fields.id1, QueryREQ.Fields.id2}, logic = Logic.OR)
@FieldNameConstants
public class QueryREQ {

    private Integer id1;

    private Integer id2;

    private Integer id3;
}

如何实现内嵌形式的条件,例如 id1=1 or (id2=2 and id3=3)

java
@Data
@ConditionTarget(value=SysUser.class, logic = Logic.OR)
@ConditionGroup(value = {QueryREQ.Fields.id1, QueryREQ.Fields.id2})
@FieldNameConstants
public class QueryREQ {

    private Integer id1;

    private Integer id2;

    private Integer id3;
}

如何在拼接条件前,做一些处理,例如设置参数的值

以下为了 查询7天,30天的数据,约定前端传 timeType =day7 和timeType = day30

java
import java.time.LocalDate;

@Data
@ConditionTarget(value = SysUser.class)
@FieldNameConstants
public class QueryREQ implements ObjectConditionLifeCycle {
    
    private String timeType;

    @Condition(property = SysUser.Fields.createTime, value = BETWEEN, toEndDayTime = true)
    private LocalDate[] rangeTime;

    @Override
    public void beforeBuildCondition() {
        //System.out.println("在构建条件前执行");
        if (StringUtils.isNotBlank(timeType)) {
            // 此处用到动态值获取
            this.rangeTimes = XbatisConfig.getDynamicValue(this.getClass(), LocalDate[].class, this.timeType);
        }
    }
}

public class MyXbatisConfig(){
    
    void init(){
        //注入最近7天的动态值
        XbatisConfig.setDynamicValue("{day7}",(clazz,type)->{
            return new LocalDate[] {LocalDate.now().minusDays(7),LocalDate.now()};
        });

        //注入最近30天的动态值
        XbatisConfig.setDynamicValue("{day30}",(clazz,type)->{
            return new LocalDate[] {LocalDate.now().minusDays(30),LocalDate.now()};
        });
    }
}

查询没有区别,就可以简化前端传参的操作