-
카테고리
-
세부 분야
백엔드
-
해결 여부
미해결
JdbcPagingItemReader에서 ID값이 읽어지지 않습니다.
22.03.13 11:52 작성 조회수 267
0
public class Customer {
@Id
@GeneratedValue
@Column(name = "customer_id")
private Long id;
private String firstName;
private String lastName;
private LocalDate birthDate;
}
@JpaCursorItemReader
@Bean
public ItemReader<Customer> customerJpaItemReader() {
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("firstname", "%customer0");
return new JpaCursorItemReaderBuilder<Customer>()
.name("jpaCursorItemReader")
.entityManagerFactory(emf)
.queryString("select c from Customer c")
.maxItemCount(100)
.currentItemCount(10)
.build();
}
@JpaCursorItemReader 실행 결과
pk값이 정상적으로 맵핑되서 올라옵니다.
@JdbcPagingItemReader
return new JdbcPagingItemReaderBuilder<Customer>()
.name("JdbcPagingItemReaderJob")
.dataSource(dataSource)
.pageSize(10)
.beanRowMapper(Customer.class)
.fetchSize(CHUNK_SIZE)
.currentItemCount(0)
.maxItemCount(100)
.selectClause("first_name, last_name, birth_date, customer_id")
.fromClause("from Customer")
.sortKeys(sortKey)
.build();
}
@JdbcPagingItemReader 실행 결과
실행 결과 : Id값만 짤려서 올라옵니다.
답변을 작성해보세요.
0
정수원
지식공유자2022.03.13
보다 정확한 테스트를 위해 소스 공유 부탁드립니다.
실제 제가 소스를 돌려보면 정상적으로 결과가 나오는 경우가 많기 때문에 질문자분께서 테스트 한 소스 그대로를 실행해 봐야 될 것 같습니다.
코린코린
질문자2022.03.13
바쁘실텐데 감사합니다!
아래에 SQL Injection / 엔티티 클래스 / JdbcCursorItemReaderConfig 클래스 / JpaPagingItemReaderConfig 클래스를 공유해드립니다. 강사님처럼 제가 SQL 스크립트를 작성해서 넣을 줄 몰라, JPA로 SQL Injection 컨트롤러 이용해서 웹 요청 올 때마다 엔티티 생성해서 DB에 밀어넣었습니다.
아래 클래스에서 JpaPagingItemReader 활성화 후 Job 수행하면 id값이 읽히는데, JdbcCursorItemReaderConfig는 id값이 읽히지 않습니다!
@SQL Injection 위한 컨트롤러
@Controller
@RequiredArgsConstructor
public class JpaConfig {
private final JpaRepository jpaRepository;
@RequestMapping("/testdata")
@ResponseBody
public String testDataInject() {
jpaRepository.testDataInject();
return "ok";
}
}
@SQL Injection 위한 Repository
@Repository
@RequiredArgsConstructor
@Transactional
public class JpaRepository {
private final EntityManager em;
@Transactional
public void testDataInject() {
for (int i = 0; i < 100; i++) {
Customer customer = Customer.builder()
.firstName("customer" + i)
.lastName(i + "customer")
.birthDate(LocalDate.now())
.build();
em.persist(customer);
}
for (int i = 0; i < 100; i++) {
Customer customer = Customer.builder()
.firstName("ali" + i)
.lastName(i + "ali")
.birthDate(LocalDate.now())
.build();
em.persist(customer);
}
for (int i = 0; i < 100; i++) {
Customer customer = Customer.builder()
.firstName("bli" + i)
.lastName(i + "bli")
.birthDate(LocalDate.now())
.build();
em.persist(customer);
}
}
}
@Entity 클래스
@Builder
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Customer {
@Id
@GeneratedValue
@Column(name = "customer_id")
private Long id;
private String firstName;
private String lastName;
private LocalDate birthDate;
}
@JdbcPagingItemReader 테스트 위한 Config 클래스
//@Configuration
@RequiredArgsConstructor
public class JdbcPagingItemReaderConfig {
private final StepBuilderFactory stepBuilderFactory;
private final JobBuilderFactory jobBuilderFactory;
private final DataSource dataSource;
private final static int CHUNK_SIZE = 10;
@Bean
public Job JdbcJob() {
return jobBuilderFactory
.get("JcbcPagingItemReaderJob")
.start(step100())
.incrementer(new RunIdIncrementer())
.build();
}
@Bean
public Step step100() {
return stepBuilderFactory
.get("JcbcPagingItemReaderStep")
.<Customer, Customer>chunk(CHUNK_SIZE)
.reader(customerItemReader())
.processor(new ItemProcessor<Customer, Customer>() {
@Override
public Customer process(Customer item) throws Exception {
System.out.println("item =" + item);
return Customer.builder()
.id(item.getId())
.lastName(item.getLastName().toUpperCase(Locale.ROOT))
.firstName(item.getFirstName().toUpperCase(Locale.ROOT))
.birthDate(item.getBirthDate())
.build();
}
})
.writer(new ItemWriter<Customer>() {
@Override
public void write(List<? extends Customer> items) throws Exception {
System.out.println("=========================");
System.out.println("JDBC Paging ITEM READER WORK");
items.forEach(customer -> System.out.println("customer = " + customer));
System.out.println("=========================");
}
})
.build();
}
@Bean
public ItemReader<Customer> customerItemReader() {
HashMap<String, Order> sortKey = new HashMap<>();
sortKey.put("first_name", Order.ASCENDING);
return new JdbcPagingItemReaderBuilder<Customer>()
.name("JdbcPagingItemReaderJob")
.dataSource(dataSource)
.pageSize(2)
.beanRowMapper(Customer.class)
// .fetchSize(CHUNK_SIZE)
.currentItemCount(0)
.maxItemCount(100)
.selectClause("first_name, last_name, birth_date, customer_id")
.fromClause("from Customer")
.sortKeys(sortKey)
.build();
}
}
@JpaCursorItemReader 테스트 위한 Config 클래스
//@Configuration
@RequiredArgsConstructor
public class JpaCursorItemReaderConfig {
private final StepBuilderFactory stepBuilderFactory;
private final JobBuilderFactory jobBuilderFactory;
private final DataSource dataSource;
private final EntityManagerFactory emf;
private final static int CHUNK_SIZE = 100;
@Bean
public Job jpaCursorItemReaderJob() {
return jobBuilderFactory
.get("jpaCursorItemReaderJob")
.start(stepJpa())
.incrementer(new RunIdIncrementer())
.build();
}
@Bean
public Step stepJpa() {
return stepBuilderFactory
.get("jpaItemReaderStep")
.<Customer, Customer>chunk(CHUNK_SIZE)
.reader(customerJpaItemReader())
.processor(new ItemProcessor<Customer, Customer>() {
@Override
public Customer process(Customer item) throws Exception {
System.out.println("item =" + item);
return Customer.builder()
.firstName(item.getFirstName().toUpperCase(Locale.ROOT))
.lastName(item.getLastName().toUpperCase(Locale.ROOT))
.birthDate(item.getBirthDate())
.id(item.getId())
.build();
}
})
.writer(new ItemWriter<Customer>() {
@Override
public void write(List<? extends Customer> items) throws Exception {
System.out.println("=========================");
System.out.println("JPA ITEM READER WORK");
items.forEach(customer -> System.out.println("customer = " + customer));
System.out.println("=========================");
}
})
.build();
}
@Bean
public ItemReader<Customer> customerJpaItemReader() {
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("firstname", "%customer0");
return new JpaCursorItemReaderBuilder<Customer>()
.name("jpaCursorItemReader")
.entityManagerFactory(emf)
.queryString("select c from Customer c")
.maxItemCount(100)
.currentItemCount(10)
.build();
}
}
답변 1