xkcoding / spring-boot-demo

🚀一个用来深入学习并实战 Spring Boot 的项目。
https://parg.co/UZM
MIT License
32.84k stars 10.82k forks source link

[demo-orm-jdbctemplate]BaseDao.getField()方法未正确过滤主键 #239

Open t1anist opened 1 year ago

t1anist commented 1 year ago

请先看《提问的智慧》,并尝试到 issue 列表 搜寻是否已经有人遇到过同样的问题。


描述问题

BaseDao.getField()方法未正确过滤主键

public static void main(String[] args) {
        BaseDao<User, Long> userDao = new UserDao(null);
        List<Field> field = userDao.getField(new User(), false);
        System.out.println(field);
    }

返回结果中包含了被注解@Pk标为主键的id。原因如下:

private List<Field> getField(T t, Boolean ignoreNull) {
        // 获取所有字段,包含父类中的字段
        Field[] fields = ReflectUtil.getFields(t.getClass());

        // 过滤数据库中不存在的字段,以及自增列
        List<Field> filterField;
        Stream<Field> fieldStream = CollUtil.toList(fields).stream().filter(field -> ObjectUtil.isNull(field.getAnnotation(Ignore.class)) || ObjectUtil.isNull(field.getAnnotation(Pk.class)));

        // 是否过滤字段值为null的字段
        if (ignoreNull) {
            filterField = fieldStream.filter(field -> ObjectUtil.isNotNull(ReflectUtil.getFieldValue(t, field))).collect(Collectors.toList());
        } else {
            filterField = fieldStream.collect(Collectors.toList());
        }
        return filterField;
    }

此函数过滤fieldStream时,filter中的两个过滤条件应当是与关系,并非或关系

期待的结果

BaseDao.getField()方法正确过滤掉被@Pk注解标为主键的Field

截屏或录像

使用||: image 使用&&: image

其他信息

请提供其他附加信息帮助我们诊断问题。