我有一个枚举,它从性别字符返回性别:
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/