利用自定义注解+切面,实现 查询数据集合时主动加序列字段, 只需要在Dao接口,方法上引入注解即可
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AddSequence {
// 可以根据需要添加注解的属性
}
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.IntStream;
@Aspect
@Component
class AddSequenceAspect {
@Around("@annotation(com.yourpackage.AddSequence)") // 替换com.yourpackage为你的包名
public Object addSequenceToResult(ProceedingJoinPoint joinPoint) throws Throwable {
Object result = joinPoint.proceed(); // 执行原方法
if (result instanceof List) {
List<?> list = (List<?>) result;
if (!list.isEmpty() && list.get(0) instanceof Map) {
List<Map<String, Object>> mapList = new ArrayList<>();
IntStream.range(0, list.size())
.forEach(i -> {
Map<String, Object> map = (Map<String, Object>) list.get(i);
Map<String, Object> newMap = new java.util.HashMap<>(map);
newMap.put("rownum", i + 1); // 添加序号列
mapList.add(newMap);
});
return mapList;
}
}
return result; // 如果不是List或List为空或不是Map类型,直接返回原结果
}
}
将上面代码放入你的工具类中,我们只需要在Dao接口的指定方法上添加@AddSequence
注解, 它将会在返回结果中加上rownum
序列字段. 我在上面工具类中,返回值定义的是List<Map<String,Object>>集合,如果你的事实体类,或Object对象,可仿照原先的进行扩展.
public interface xxxxDao {
@AddSequence
List<Map<String,Object>> getDataList(Map<String,Object> map);
}
运行结果: