这是我参与更文挑战的第29天,活动详情查看: 更文挑战java
mongo
中,查询是经过MongoTemplate
来实现数据的查询已验收
、未验收
实际存储的是一、2@Data
public class DangersBook implements Serializable {
@TimeSequence
@Ignore
@Id
@Query
private Long id;
@DangersNo
@Ignore
@Query
@LikeQuery
private String dangersNo;
@Ids
private String instance_id;
@DangersType
@Ids
private String app_id;
@Ids
@Query
@DangersEntId
@OrQuery
private String entId;
private String created_by;
@Query
@Ids
private String zuoyeleixing;
@Date
@Query
private String pizhunkaishi;
@Date
@Query
private String pizhunjieshu;
@UpdateItem(value = "已验收")
@Query
@OrQuery
private String yanshouStatus;
@Query
@Date
@UpdateItem(value = "")
private String finishTime;
private String jianweixiuxukezheng;
private String zuoyedengji;
@Query
@LikeQuery
private String zuoyeneirong;
/** * @Description 用于判断是否应该生成编号 */
@Ignore
@Query
private String createDangerNo;
private String laowubanzu;
@Query
private String test;
@Query
private String interrupt;
@Query
@OrQuery
private String year;
}
复制代码
DangersBook
中的全部属性!这是咱们对反射的第一处运用!实际上在项目中凡是须要写活属性的获取的都是经过反射进行获取结合注解进行属性过滤!TimeSequence annotation = declaredField.getAnnotation(TimeSequence.class);
if (annotation!=null) {
//雪花算法
long generatorId = DistributedIDUtils.getInstance().getGeneratorId(1l, 2l, 3l);
declaredField.setAccessible(true);
declaredField.set(object, generatorId);
}
复制代码
TimeSequence
以后咱们就能够经过雪花算法生成id而后经过属性将生成的id赋值进去!Ignore
就是这个做用Ignore ignore = declaredField.getAnnotation(Ignore.class);
if (ignore != null) {
continue;
}
复制代码
Query
基础上进行扩展的com.ay.sdksm.custom.components.expose.annation.Query queryField = declaredField.getAnnotation(com.ay.sdksm.custom.components.expose.annation.Query.class);
if (queryField != null) {
//须要添加查询条件
try {
declaredField.setAccessible(true);
Object o = declaredField.get(dangersBook);
if (null != o&&!"".equals(o.toString())) {
String svalue = o.toString();
Date dateAnnotation = declaredField.getAnnotation(Date.class);
LikeQuery likeQuery = declaredField.getAnnotation(LikeQuery.class);
if (dateAnnotation != null) {
String dateValue = svalue;
if (StringUtils.isEmpty(dateValue)) {
continue;
}
String[] dateSplit = dateValue.split(",");
String start = dateSplit[0];
String end = start;
if (dateSplit.length >= 2) {
end = dateSplit[1];
}
criteria.and(declaredField.getName()).gte(start).lte(end);
} else if(likeQuery != null){
Pattern pattern = Pattern.compile(String.format(".*%s.*", svalue), Pattern.CASE_INSENSITIVE);
criteria.and(declaredField.getName()).regex(pattern);
}else {
OrQuery orQuery = declaredField.getAnnotation(OrQuery.class);
if (null != orQuery) {
String[] split = svalue.split(",");
String start = split[0];
String end = split[0];
if (split.length > 1) {
end = split[1];
}
criteria.and(declaredField.getName()).in(start, end);
} else {
if (svalue.contains("$ne")&& JsonUtils.getInstance().isJson(svalue)) {
JSONObject jsonObject = JSONObject.parseObject(svalue);
String $ne = jsonObject.getString("$ne");
criteria.and(declaredField.getName()).ne($ne);
}else if(svalue.contains("$like")&& JsonUtils.getInstance().isJson(svalue)){
//模糊查询
JSONObject jsonObject = JSONObject.parseObject(svalue);
String $like = jsonObject.getString("$like");
criteria.and(declaredField.getName()).is(String.format("/%s/",$like));
} else {
Class<?> type = declaredField.getType();
if (type == Long.class) {
criteria.and(declaredField.getName()).is(Long.valueOf(svalue));
} else {
criteria.and(declaredField.getName()).is(svalue);
}
}
}
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
复制代码
Query
注解表示须要对字段进行条件组装。当遇到Date咱们就须要将条件值进行定制处理咱们约定的条件值是已逗号间隔的时间段。这样咱们就能够动态的支持时间点、时间段的查询。LikeQuery
表示是模糊查询。DangersNo annotation = declaredField.getAnnotation(DangersNo.class);
if (annotation != null) {
//根据业务生成指定格式的数据ID;这里比较复杂。代码省略。。。。。。
}
复制代码
点赞,XDM程序员