
com.gitee.qdbp.jdbc.stream.CrudStream Maven / Gradle / Ivy
package com.gitee.qdbp.jdbc.stream;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import com.gitee.qdbp.able.enums.LogicType;
import com.gitee.qdbp.able.exception.ServiceException;
import com.gitee.qdbp.able.jdbc.condition.DbUpdate;
import com.gitee.qdbp.able.jdbc.condition.DbUpdateForFieldCore;
import com.gitee.qdbp.able.jdbc.condition.DbUpdateForStartCore;
import com.gitee.qdbp.able.jdbc.condition.DbWhere;
import com.gitee.qdbp.able.jdbc.condition.DbWhereForFieldCore;
import com.gitee.qdbp.able.jdbc.condition.DbWhereForOnFieldless;
import com.gitee.qdbp.able.jdbc.condition.DbWhereForStartCore;
import com.gitee.qdbp.able.jdbc.condition.SkipType;
import com.gitee.qdbp.able.jdbc.fields.ExcludeFields;
import com.gitee.qdbp.able.jdbc.fields.Fields;
import com.gitee.qdbp.able.jdbc.fields.IncludeFields;
import com.gitee.qdbp.able.jdbc.ordering.Orderings;
import com.gitee.qdbp.able.jdbc.paging.Paging;
import com.gitee.qdbp.jdbc.api.CrudDao;
import com.gitee.qdbp.jdbc.exception.DbErrorCode;
import com.gitee.qdbp.jdbc.model.SimpleFieldColumn;
import com.gitee.qdbp.jdbc.utils.ParseTools;
import com.gitee.qdbp.tools.utils.VerifyTools;
/**
* 单表查询流式操作
*
* @author zhaohuihua
* @version 20210529
*/
public class CrudStream implements Serializable {
/** serialVersionUID **/
private static final long serialVersionUID = 1L;
protected final CrudDao dao;
public CrudStream(CrudDao dao) {
this.dao = dao;
}
/**
* 查询指定字段
*
List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
.select("id,userCode,realName") // 只查某些字段
// .selectExclude("password") // 排除掉密码字段
.list();
*
*
* @param fields 字段列表
* @return 返回后续流式操作对象
*/
public CrudOnAfterSelectStream select(String... fields) {
if (fields == null || fields.length == 0) {
return new CrudOnAfterSelectStream<>(dao, Fields.ALL);
} else {
return new CrudOnAfterSelectStream<>(dao, new IncludeFields(fields));
}
}
/**
* 查询指定字段
*
List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
.select("id,userCode,realName") // 只查某些字段
// .selectExclude("password") // 排除掉密码字段
.list();
*
*
* @param fields 字段列表
* @return 返回后续流式操作对象
*/
public CrudOnAfterSelectStream select(List fields) {
return new CrudOnAfterSelectStream<>(dao, new IncludeFields(fields));
}
/**
* 查询指定字段
*
List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
.select(new IncludeFields("id,userCode,realName")) // 只查某些字段
// .select(new IncludeFields("password")) // 排除掉密码字段
.list();
*
*
* @param fields 字段列表
* @return 返回后续流式操作对象
*/
public CrudOnAfterSelectStream select(Fields fields) {
return new CrudOnAfterSelectStream<>(dao, fields);
}
/**
* 排除指定字段, 只查询不在此列表中的字段
*
List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
// .select("id,userCode,realName") // 只查某些字段
.selectExclude("password") // 排除掉密码字段
.list();
*
*
* @param fields 字段列表
* @return 返回后续流式操作对象
*/
public CrudOnAfterSelectStream selectExclude(String... fields) {
return new CrudOnAfterSelectStream<>(dao, new ExcludeFields(fields));
}
/**
* 排除指定字段, 只查询不在此列表中的字段
*
List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
// .select("id,userCode,realName") // 只查某些字段
.selectExclude("password") // 排除掉密码字段
.list();
*
*
* @param fields 字段列表
* @return 返回后续流式操作对象
*/
public CrudOnAfterSelectStream selectExclude(List fields) {
return new CrudOnAfterSelectStream<>(dao, new ExcludeFields(fields));
}
/**
* Where条件
*
List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
.where("userType").equals(1)
.and("createTime").between(DateTools.addDay(now, -1), DateTools.addDay(now, +1))
.and().subCondition((w) -> {
w.on("userCode").like("test")
.or("realName").like("test");
})
.end()
.orderBy("createTime desc")
.list();
*
* @param fieldName 字段名称
* @return 返回后续流式操作对象
*/
public DbWhereForFieldCore> where(String fieldName) {
DbWhere where = DbWhere.newEmptiableWhere();
CrudOnAfterWhereByStream next = new CrudOnAfterWhereByStream<>(dao, where);
DbWhereForStartCore> start = new DbWhereForStartCore<>(next, where);
return new DbWhereForFieldCore<>(start, SkipType.NONE, LogicType.AND, fieldName);
}
/**
* 查询条件
*
List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
.where().subCondition((w) -> {
w.on("userCode").like("test")
.or("realName").like("test");
})
.and("userType").equals(1)
.end()
.orderBy("createTime desc")
.list();
*
* @return 返回后续流式操作对象
*/
public DbWhereForOnFieldless> where() {
DbWhere where = DbWhere.newEmptiableWhere();
CrudOnAfterWhereByStream next = new CrudOnAfterWhereByStream<>(dao, where);
DbWhereForStartCore> start = new DbWhereForStartCore<>(next, where);
return new DbWhereForOnFieldless<>(start, SkipType.NONE);
}
/**
* 设置Where条件
*
* @param where Where条件
* @return 返回后续流式操作对象
*/
public CrudOnAfterWhereByStream whereBy(DbWhere where) {
return new CrudOnAfterWhereByStream<>(dao, where);
}
/**
* 从实体类构建Where对象
*
List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
.whereBy(user)
.list();
*
*
* @param entity 实体类
* @return 返回后续流式操作对象
* @see ParseTools#parseBeanToDbWhere(Object)
*/
public CrudOnAfterWhereByStream whereBy(T entity) {
DbWhere where = dao.plugins().parseTools().parseBeanToDbWhere(entity);
return new CrudOnAfterWhereByStream<>(dao, where);
}
/**
* 从Map构建Where对象
*
List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
.whereBy(map)
.list();
*
* 只会包含clazz注解中通过@Column指定的字段名
* 应注意, 此时参数由前端传入, 条件不可控, 也有可能条件为空, 需要仔细检查条件内容, 防止越权操作
* 转换规则:
fieldName$Equals(=), fieldName$NotEquals(!=),
fieldName$LessThen(<), fieldName$LessEqualsThen(<=),
fieldName$GreaterThen(>), fieldName$GreaterEqualsThen(>=),
fieldName$IsNull, fieldName$IsNotNull,
fieldName$Like, fieldName$NotLike, fieldName$Starts, fieldName$Ends,
fieldName$In, fieldName$NotIn, fieldName$Between
*
*
* @param map Map参数
* @return 返回后续流式操作对象
* @see ParseTools#parseBeanToDbWhere(Object)
*/
public CrudOnAfterWhereByStream whereBy(Map map) {
DbWhere where = dao.plugins().parseTools().parseBeanToDbWhere(map);
return new CrudOnAfterWhereByStream<>(dao, where);
}
/**
* 以ID作为查询条件
*
List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
.whereById("U0000001")
.find();
// logicalDelete();
// physicalDelete();
*
*
* @param id 实体主键
* @return 返回后续流式操作对象
*/
public CrudOnAfterByIdStream whereById(Serializable id) {
VerifyTools.requireNotBlank(id, "id");
return new CrudOnAfterByIdStream<>(dao, id);
}
/**
* 以ID列表作为查询条件
*
List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
.whereByIds("U0000001", "U0000002", ...)
.orderBy("createTime desc")
.list();
*
*
* @param ids ID列表
* @return 返回后续流式操作对象
*/
public CrudOnAfterWhereByStream whereByIds(String... ids) {
VerifyTools.requireNotBlank(ids, "ids");
return doWhereByIds(Arrays.asList(ids));
}
/**
* 以ID列表作为查询条件
*
List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
.whereByIds("U0000001", "U0000002", ...)
.orderBy("createTime desc")
.list();
*
*
* @param ids ID列表
* @return 返回后续流式操作对象
*/
public CrudOnAfterWhereByStream whereByIds(Collection extends Serializable> ids) {
VerifyTools.requireNotBlank(ids, "ids");
return doWhereByIds(ids);
}
protected CrudOnAfterWhereByStream doWhereByIds(Collection extends Serializable> ids) {
SimpleFieldColumn pk = dao.sqlHelper().fragment().getPrimaryKey();
if (pk == null) { // 没有找到主键字段
String details = "UnsupportedWhereByIds, class=" + dao.getBeanClass().getName();
throw new ServiceException(DbErrorCode.DB_PRIMARY_KEY_FIELD_IS_UNRESOLVED).setDetails(details);
}
String primaryField = pk.getFieldName();
DbWhere where = DbWhere.newEmptiableWhere();
where.on(primaryField).in(ids);
return new CrudOnAfterWhereByStream<>(dao, where);
}
/**
* 设置OrderBy条件
*
List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
.orderBy("createTime desc")
.list();
*
*
* @param orderings OrderBy条件
* @return 返回后续流式操作对象
*/
public CrudOnAfterOrderByStream orderBy(String orderings) {
return orderBy(Orderings.of(orderings));
}
/**
* 设置OrderBy条件
*
List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
.orderBy("createTime desc")
.list();
*
*
* @param orderings OrderBy条件
* @return 返回后续流式操作对象
*/
public CrudOnAfterOrderByStream orderBy(Orderings orderings) {
return new CrudOnAfterOrderByStream<>(dao, DbWhere.NONE, orderings);
}
/**
* 根据条件分页查询实体列表
*
List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
.pageBy(1, 10) // 查第1页,每页10行
.list().asPartList(); // 分页后返回的是PageList, 需要转换为普通List
// .listFieldValues("deptCode", true, String.class).asPartList(); // 查询部门编号, true=去重
*
*
* @param pageIndex 第几页
* @param pageSize 每页行数
* @return 列表数据
*/
public CrudOnAfterPagingStream pageBy(int pageIndex, int pageSize) {
return pageBy(new Paging(pageIndex, pageSize));
}
/**
* 根据条件分页查询实体列表
*
List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
.pageBy(1, 10, 88) // 查第1页,每页10行, 88=提前查询的总行数
.list().asPartList(); // 分页后返回的是PageList, 需要转换为普通List
// .listFieldValues("deptCode", true, String.class).asPartList(); // 查询部门编号, true=去重
*
*
* @param pageIndex 第几页
* @param pageSize 每页行数
* @param total 总行数(用于提前查询总行数的情况)
* @return 列表数据
*/
public CrudOnAfterPagingStream pageBy(int pageIndex, int pageSize, int total) {
return pageBy(new Paging(pageIndex, pageSize, total));
}
/**
* 根据条件分页查询实体列表
*
List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
.pageBy(1, 10, false) // 查第1页,每页10行, false=无需统计总数
.list().asPartList(); // 分页后返回的是PageList, 需要转换为普通List
// .listFieldValues("deptCode", true, String.class).asPartList(); // 查询部门编号, true=去重
*
*
* @param pageIndex 第几页
* @param pageSize 每页行数
* @param needCount 是否统计总数
* @return 列表数据
*/
public CrudOnAfterPagingStream pageBy(int pageIndex, int pageSize, boolean needCount) {
return pageBy(new Paging(pageIndex, pageSize, needCount));
}
/**
* 根据条件分页查询实体列表
*
List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
.pageBy(new Paging(1,10,false)) // 查第1页,每页10行, false=无需统计总数
.list().asPartList(); // 分页后返回的是PageList, 需要转换为普通List
// .listFieldValues("deptCode", true, String.class).asPartList(); // 查询部门编号, true=去重
*
*
* @param paging 分页参数
* @return 列表数据
*/
public CrudOnAfterPagingStream pageBy(Paging paging) {
return new CrudOnAfterPagingStream<>(dao, DbWhere.NONE, Orderings.NONE, paging);
}
/**
* 查询实体全部数据
* List<SysUser> users = qdbcBoot.crudStream(SysUser.class).list();
*
* @return 列表数据
*/
public List list() {
return dao.list(Fields.ALL, DbWhere.NONE, Orderings.NONE);
}
/**
* 根据条件查询某个字段的值列表
*
List<String> deptCodes = qdbcBoot.crudStream(SysUser.class)
.listFieldValues("deptCode", true, String.class); // 查询部门编号, true=去重
*
*
* @param fieldName 指定字段名
* @param distinct 是否去重
* @param valueClazz 字段值类型
* @return 字段的值列表
*/
public List listFieldValues(String fieldName, boolean distinct, Class valueClazz)
throws ServiceException {
return dao.listFieldValues(fieldName, distinct, DbWhere.NONE, Orderings.NONE, valueClazz);
}
/**
* 根据条件统计实体数量
*
int total = qdbcBoot.crudStream(SysUser.class)
.count();
*
*
* @return 数据数量
*/
public int count() throws ServiceException {
return dao.count(DbWhere.NONE);
}
/**
* 根据条件分组统计实体数量
*
Map<String, Integer> result = qdbcBoot.crudStream(SysUser.class)
.groupCount("userType");
SELECT USER_TYPE, COUNT(*) FROM SYS_USER
GROUP BY USER_TYPE
*
*
* @param groupBy 分组条件
* @return 分组统计结果
*/
public Map groupCount(String groupBy) throws ServiceException {
return dao.groupCount(groupBy, DbWhere.NONE);
}
/**
* 开始递归查询
* recursiveBy(codeField, parentField) 按什么字段进行递归查询
* startBy 起始编号
* filterBy 数据过滤条件, 过滤哪些数据参与递归 (如数据状态,租户编号等条件)
* searchBy 结果搜索条件 (如用户输入的查询条件) 这些条件如果放在filterWhere中将无法生成完整的树
* 注意: 查询结果包括startCode节点的自身记录, 如果不需要应在searchWhere条件排除
*
List<SysDept> depts = qdbcBoot.crudStream(SysDept.class)
.recursiveBy("deptCode", "parentCode") // 按什么进行递归
.startBy("D01", "D02") // 起始编号
.filterBy("tenantCode").equals("T001").end() // 租户编号
.searchBy("id").notIn("D01", "D02").end() // 查询子节点, 但不要包含起始编号自身
.listChildren();
// .listParents();
*
*
* @param codeField 编号字段名
* @param parentField 上级编号字段名
* @return 返回后续流式操作对象
*/
public RecursiveQueryStream recursiveBy(String codeField, String parentField) {
return new RecursiveQueryStream<>(dao, codeField, parentField);
}
/**
* 实体类操作
*
int rows = qdbcBoot.crudStream(SysUser.class)
.entity(user)
.insert();
// .update();
*
*
* @param entity 实体类
* @return 返回后续流式操作对象
*/
public CrudOnAfterEntityStream entity(T entity) {
VerifyTools.requireNonNull(entity, "entity");
return new CrudOnAfterEntityStream<>(dao, entity);
}
/**
* 实体类操作
*
int rows = qdbcBoot.crudStream(SysUser.class)
.entity(user)
.insert();
// .update();
*
*
* @param entity 实体类
* @return 返回后续流式操作对象
*/
public CrudOnAfterEntityStream entity(Map entity) {
VerifyTools.requireNotBlank(entity, "entity");
return new CrudOnAfterEntityStream<>(dao, entity);
}
/**
* 实体批量操作
*
List<String> ids = qdbcBoot.crudStream(SysUser.class)
.entities(user)
.insert();
// .update();
*
*
* @param entities 实体类
* @return 返回后续流式操作对象
*/
public CrudOnAfterEntitiesStream entities(List> entities) {
return new CrudOnAfterEntitiesStream<>(dao, entities);
}
/**
* 设置更新条件
*
* @param ud 更新条件
* @return 返回后续流式操作对象
*/
public CrudOnAfterSetByStream updateBy(DbUpdate ud) {
return new CrudOnAfterSetByStream<>(dao, ud);
}
/**
* 更新操作
*
int rows = qdbcBoot.crudStream(SysUser.class)
.updateSet("userName").to("zhaohuihua") // 用户名修改为指定值
.set("memberScore").add(+100) // 会员积分增加100
.set("memberScore").add(-100) // 会员积分减少100
.set("userState").toNull() // 用户状态修改为空
.end()
// .whereById("U0000001")
.where("userId").equals("U0000001")
.and("userState").in(UserState.NORMAL, UserState.LOCKED)
.end()
.update();
*
*
* @param fieldName 字段名
* @return 返回后续流式操作对象
*/
public DbUpdateForFieldCore> updateSet(String fieldName) {
DbUpdate ud = new DbUpdate();
CrudOnAfterSetByStream next = new CrudOnAfterSetByStream<>(dao, ud);
DbUpdateForStartCore> start = new DbUpdateForStartCore<>(next, ud);
return new DbUpdateForFieldCore<>(start, fieldName);
}
/**
* 更新操作
*
int rows = qdbcBoot.crudStream(SysUser.class)
.updateBy()
// 用户名修改为指定值
// .ifHasValue() 如果userName有值(不为空)才会添加该条件
.ifHasValue().set("userName").to(userName)
// 用户状态修改为空
// ifTrue(resetState) 如果resetState=true才会添加该条件
.ifTrue(resetState).set("userState").toNull()
.end()
// .whereById("U0000001")
.where("userId").equals("U0000001")
.and("userState").in(UserState.NORMAL, UserState.LOCKED)
.end()
.update();
*
*
* @return 返回后续流式操作对象
*/
public DbUpdateForStartCore> updateBy() {
DbUpdate ud = new DbUpdate();
CrudOnAfterSetByStream next = new CrudOnAfterSetByStream<>(dao, ud);
return new DbUpdateForStartCore<>(next, ud);
}
/**
* 逻辑删除全部记录
* qdbcBoot.crudStream(SysUser.class).logicalDelete();
*
* @return 删除行数
*/
public int logicalDelete() {
return dao.logicalDelete(DbWhere.NONE);
}
/**
* 物理删除全部记录
* qdbcBoot.crudStream(SysUser.class).physicalDelete();
*
* @return 删除行数
*/
public int physicalDelete() {
return dao.physicalDelete(DbWhere.NONE);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy