有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Spring批处理读取器中sql查询内部的java调用方法

我有一个枚举,它从性别字符返回性别:

public enum Gender {
        FEMALE('F'), MALE('M');
        private char gender;

        Gender(char gender) {
            this.gender = gender;
        }

        public static Gender getSex(char gender) {
            return Arrays.stream(Gender.values())
                    .filter(s -> s.gender == gender)
                    .findFirst()
                    .orElseThrow(NoSuchElementException::new);
        }
    }

在一份工作中,我有一个带有queryprovider的阅读器,可以从DB中选择sex列(值为F或M)

 ItemReader<UserDTO> userDatabaseReader() {
        JdbcPagingItemReader<UserDTO> reader = new JdbcPagingItemReader<>();
        reader.setDataSource(dataSource);
        reader.setPageSize(100);
        reader.setRowMapper(new BeanPropertyRowMapper<>(UserDTO.class));
        MySqlPagingQueryProvider queryProvider = new MySqlPagingQueryProvider();

        queryProvider.setSelectClause("SELECT u.id, " +
                "u.firstname as firstName, " +
                "u.sex as gender, " +
                "u.eliminated ^ 1 as active");

        queryProvider.setFromClause("FROM users u");
        HashMap<String, Order> sortKeys = new HashMap<>();
        sortKeys.put("u.id", Order.DESCENDING);
        queryProvider.setSortKeys(sortKeys);

        reader.setQueryProvider(queryProvider);
        return reader;

    }

我有性别枚举字段的UserDTO。 如何从调用getSex()方法的列char中获取性别枚举,并将其作为枚举传递给UserDTO


共 (1) 个答案

  1. # 1 楼答案

    可以手动实现行映射器

    差不多

    class UserDTORowMapper implements RowMapper<UserDTO> {
    
        @Override
        public UserDTO mapRow(ResultSet rs, int rowNum) throws SQLException {
    
            return new UserDTO(rs.getString("id"), 
                               rs.getString("firstName"), 
                               GenderEnum.valueOf(rs.getString("gender")));
        }
    }
    

    而不是你的读者

     ItemReader<UserDTO> userDatabaseReader() {
            JdbcPagingItemReader<UserDTO> reader = new JdbcPagingItemReader<>();
            reader.setDataSource(dataSource);
            reader.setPageSize(100);
            reader.setRowMapper(new UserDTORowMapper());
            MySqlPagingQueryProvider queryProvider = new MySqlPagingQueryProvider();
    
            queryProvider.setSelectClause("SELECT u.id, " +
                    "u.firstname as firstName, " +
                    "u.sex as gender, " +
                    "u.eliminated ^ 1 as active");
    
            queryProvider.setFromClause("FROM users u");
            HashMap<String, Order> sortKeys = new HashMap<>();
            sortKeys.put("u.id", Order.DESCENDING);
            queryProvider.setSortKeys(sortKeys);
    
            reader.setQueryProvider(queryProvider);
            return reader;
    
        }
    

    代码多一点,但你有更多的灵活性