对象转条件
目标对象需要加上@ConditionTarget(实体类) 或者本身就是实体类
@ConditionTarget(实体类) 标记这个类的目标实体类
为什么要加这个?答:为了减少字段配置,默认是继承@ConditionTarget(实体类)的实体类
如何配置属性的查询条件类型?
默认情况下,字段有值就会自动拼接 eq行为;但是, 不是所有的条件的都是等于(eq),所以 我们需要在类上加一个注解;@Condition
@Condition 属性介绍
名称 | 必须 | 说明 |
---|---|---|
value | 否 | 条件的类型,默认是EQ |
target | 目标实体类 | 可忽略,默认和@ConditionTarget(实体类)一样或者是当前实体类 |
property | 否 | 目标实体类的属性名,如果和实体类字段一样,则可忽略 |
storey | 否 | source实体类的存储层级 |
likeMode | 否 | like的方式,左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()};
});
}
}
查询没有区别,就可以简化前端传参的操作