java - 在 Spring Batch Reader 中的 sql 查询中调用方法

标签 java mysql spring-batch

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

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);
        }
    }

在作业中,我有一个带有查询提供程序的读取器,它从数据库中选择列性别(值为 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() 方法的字符列中获取性别枚举,并将其作为枚举传递给 UserDTO?

最佳答案

该方法是在 Job Processor 中处理读取器结果的每一项。我必须在 DTO 中创建名为 sex 的新属性来存储数据库中的 char sex 列,并使用该属性值获取性别枚举列。这里处理器:

@Bean
ItemProcessor<UserDTO, UserDTO> userProcessor() {
    return item -> {
        try {
            item.setGender(UserDTO.Gender.getGender(item.getSex()));
        } catch (Exception ex) {
            log.error("Error trying to process user '{}'", item.getId());
        }
        return item;
    };
}

在查询中:

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

关于java - 在 Spring Batch Reader 中的 sql 查询中调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54670589/

相关文章:

java - 强制 MapStruct 使用自定义方法而不是 dto 值

java - JLabel 随输入到 JTextArea 中的文本移动

java - 在 Java 中,使用 logback 框架,有没有办法动态配置聊天日志消息的限制

java - 使用 Spring Boot 和 Spring Batch 读取 .csv 文件并将其存储在数据库中

基于 Spring Batch block 的方法在 Item Writer 中调用 REST API

spring-batch - Spring-Batch 项目的典型包命名约定是什么?

java - 如何找到图像的主色?

php - 无法在我的 SQL 语句中获取空格

php - 适用于 Laravel 5.* 的 Gitlab CI

mysql - 当列数据发生变化时如何获取行