由于很多查询条件都有共性,而且都是重复的工作,所以自定义了注解,来实现动态查询的功能,这个是最简单的查询 ,后面有时间再扩展。主要用到以下的注解和相关的类(简单记录,后期再整理):
1、
@Data
public class BaseQuery {
/**
* 页码
*/
private int pageNo = 1;
/**
* 每页行数
*/
private int pageSize = 1000;
/**
* 排序字段
*/
private String sort;
/**
* 排序方式
*/
private String direction = "asc";
}
2、
public class BaseMapper<T> {
/**
* 领料单基本信息
*/
@Autowired
protected Mapper<T> mapper;
}
3、
public class BaseForQuery<T> extends BaseMapper<T> {
/**
* 获取没有特殊操作的查询条件
*
* @param queryParams 查询的参数
* @param entityObj 实体对象
* @return 返回查询的对象
*/
protected static <K extends BaseQuery, V> Example getExample(final K queryParams, final Class<V> entityObj) {
final Example example = new Example(entityObj, false);
if (queryParams == null) {
return example;
}
// 数据库对象的字段
final Map<String, Annotation[]> hashMapDb = (entityObj);
if (hashMapDb == null || (())) {
return example;
}
// 排序
(queryParams, example, hashMapDb);
// 条件
(example, queryParams, hashMapDb);
return example;
}
/**
* 设置 条件
*
* @param example 条件
* @param queryParams 请求参数
* @param hashMapDb 数据库
*/
private static <K extends BaseQuery> void getCondition(final Example example, final K queryParams,
final Map<String, Annotation[]> hashMapDb) {
final criteria = ();
(criteria, queryParams, hashMapDb);
}
/**
* 获取条件
*
* @param criteria 查询条件
* @param hashMapDb 数据库字段
*/
private static <K> void getCondition(final criteria, final K queryParams
, final Map<String, Annotation[]> hashMapDb) {
final Field[] fields = ().getDeclaredFields();
if (fields == null || == 0 || (queryParams)) {
return;
}
for (final Field field : fields) {
// 获取字段对应的值
Object value;
try {
(true);
value = (queryParams);
} catch (final IllegalAccessException e) {
continue;
}
if ((value)) {
continue;
}
// 用数据库生成的字段名称,避免异常
final String name = ();
final Optional<String> optionalField = ().stream()
.filter(n -> (name)).findAny();
if (!()) {
continue;
}
final Condition condition = ();
if (condition == null) {
continue;
}
if (!(()) && ().getKey() == ) {
value = (((), DateTimeFormatter
.ofPattern(())).atZone(()).toInstant());
}
switch (().getKey()) {
case "Equals":
(name, value);
break;
case "Like":
(name, ().concat("%"));
break;
case "GreaterThan":
(name, value);
break;
case "GreaterThanOrEqualTo":
(name, value);
break;
case "LessThan":
(name, value);
break;
case "LessThanOrEqualTo":
(name, value);
break;
case "IsNotNull":
(name);
break;
case "IsNull":
(name);
break;
default:
break;
}
}
(criteria, ().getSuperclass(), hashMapDb);
}
/**
* 排序
*
* @param queryParams 请求参数
* @param example 查询条件
* @param hashMapDb 数据库的字段
* @param <K> 泛型
*/
private static <K extends BaseQuery> void setOrderBy(final K queryParams, final Example example, final Map<String, Annotation[]> hashMapDb) {
if (!(())) {
String sort = ();
final Optional<String> optionalField = ().stream().filter(n ->
(())).findAny();
if (()) {
// 获取属性对应的字段
sort = ();
final Optional<Annotation> annotation = (hashMapDb
.get(sort)).filter(n -> n instanceof Column).findAny();
if (()) {
final Column column = (Column) ();
sort = ();
}
}
if ((())) {
(sort);
} else {
((" ").concat(()));
}
}
}
/**
* 获取总行数和查询的条件
*
* @param queryParams 查询的请求参数
* @param entityObj 实体对象
* @param <K> 查询的请求参数 泛型对象
* @param <V> 实体对象 泛型对象
* @return 返回总的行数
*/
protected <K extends BaseQuery, V> ResultInfo<List<T>, BaseSummary> getPagerData(final K queryParams, final Class<V> entityObj) {
final Example example = (queryParams, entityObj);
return (queryParams, example);
}
/**
* 获取总行数和查询的条件
*
* @param queryParams 查询的请求参数
* @param example 查询条件Example
* @param <K> 查询的请求参数 泛型对象
* @return 返回总的行数
*/
protected <K extends BaseQuery> ResultInfo<List<T>, BaseSummary> getPagerData(final K queryParams, final Example example) {
final ResultInfo resultInfo = new ResultInfo();
final int count = (example);
final BaseSummary baseSummary = new BaseSummary();
(count);
// 总条数
(baseSummary);
List<T> list = new ArrayList<>();
if (() != 0) {
// 明细数据
final int pageNo = ();
final int pageSize = ();
final int offset = (pageNo - 1) * pageSize;
final RowBounds rowBounds = new RowBounds(offset, pageSize);
// 查询数据
list = (example, rowBounds);
}
(list);
return resultInfo;
}
/**
* 返回分页之后的数据
*
* @param k 带有分页的信息
* @param lst 列表
* @param <K> 泛型
* @return 返回分页之后的数据
*/
protected static <K extends BaseQuery, V> List<V> getLists(final K k, final List<V> lst) {
final int beginIndex = (() - 1) * ();
int endIndex = () * ();
if (() < endIndex) {
endIndex = ();
}
return (beginIndex, endIndex);
}
/**
* 排序
*
* @param forQuery 查询条件
* @param example example
*/
protected <T extends BaseQuery> void setExampleOrderBy(final T forQuery, final Example example) {
if (!(())) {
if (!(()) && "desc".equalsIgnoreCase(())) {
(()).desc();
} else {
(()).asc();
}
}
}
}
4、
@Data
public class ResultInfo<T,E> {
/**
* 列表数据
*/
private T detail;
/**
* 总条数
*/
private E summary;
}
5、
@Data
public class BaseSummary {
/**
* 总条数
*/
private long totalRows;
}
6、
@Constraint(validatedBy = )
@Target({, , ElementType.ANNOTATION_TYPE, , })
@Retention()
@Documented
public @interface Condition {
/**
* 默认为 等于
*
* @return 等于
*/
ConditionEnum conditionEnum() default ;
/**
* 数据类型 默认 字符串
*
* @return 字符串
*/
DataTypeEnum dataTypeEnum() default ;
/**
* 格式
*
* @return 格式
*/
String format() default "";
}
7、
public enum ConditionEnum {
/**
* 等于
*/
Equals("Equals", "等于"),
/**
* 等于
*/
Like("Like", "等于"),
/**
* 大于
*/
GreaterThan("GreaterThan", "大于"),
/**
* 大于等于
*/
GreaterThanOrEqualTo("GreaterThanOrEqualTo", "大于等于"),
/**
* 小于
*/
LessThan("LessThan", "小于"),
/**
* 小于等于
*/
LessThanOrEqualTo("LessThanOrEqualTo", "小于等于"),
/**
* 不为空
*/
IsNotNull("IsNotNull", "不为空"),
/**
* 为空
*/
IsNull("IsNull", "为空");
/**
* 构造函数
*
* @param key 键
* @param value 值
*/
ConditionEnum(final String key, final String value) {
= key;
= value;
}
/**
* 键
*/
private final String key;
/**
* 值
*/
private final String value;
/**
* 获取 健
*
* @return 健
*/
public String getKey() {
return ;
}
/**
* 获取 值
*
* @return 值
*/
public String getValue() {
return ;
}
}
8、
public enum DataTypeEnum {
/**
* Integer
*/
INTEGER(, "Integer"),
/**
* Date
*/
DATE(, "Date"),
/**
* Double
*/
DOUBLE(, "Double"),
/**
* Float
*/
FLOAT(, "Float"),
/**
* BigDecimal
*/
BIGDECIMAL(, "BigDecimal"),
/**
* String
*/
STRING(, "String"),
/**
* Long
*/
LONG(, "Long");
/**
* 构造函数
*
* @param key 键
* @param value 值
*/
DataTypeEnum(final Class key, final String value) {
= key;
= value;
}
/**
* 键
*/
private final Class key;
/**
* 值
*/
private final String value;
/**
* 获取 健
*
* @return 健
*/
public Class getKey() {
return ;
}
/**
* 获取 值
*
* @return 值
*/
public String getValue() {
return ;
}
}