diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/HibernateCursorItemReader.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/HibernateCursorItemReader.java index a3f146420..7923ed88a 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/HibernateCursorItemReader.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/HibernateCursorItemReader.java @@ -81,8 +81,11 @@ public class HibernateCursorItemReader extends ExecutionContextUserSupport imple } if (cursor.next()) { currentProcessedRow++; - Object data = cursor.get(0); - return data; + Object[] data = cursor.get(); + if (data.length>1) { + return data; + } + return data[0]; } return null; } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/HibernateCursorProjectionItemReaderIntegrationTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/HibernateCursorProjectionItemReaderIntegrationTests.java new file mode 100644 index 000000000..bb8381370 --- /dev/null +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/HibernateCursorProjectionItemReaderIntegrationTests.java @@ -0,0 +1,63 @@ +package org.springframework.batch.item.database; + +import org.hibernate.SessionFactory; +import org.hibernate.StatelessSession; +import org.springframework.batch.item.ExecutionContext; +import org.springframework.batch.item.ItemReader; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.orm.hibernate3.LocalSessionFactoryBean; +import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests; + +/** + * Tests for {@link HibernateCursorItemReader} using {@link StatelessSession}. + * + * @author Robert Kasanicky + */ +public class HibernateCursorProjectionItemReaderIntegrationTests extends AbstractTransactionalDataSourceSpringContextTests { + + protected ItemReader reader; + protected ExecutionContext executionContext; + + protected String[] getConfigLocations() { + return new String[] { "org/springframework/batch/item/database/data-source-context.xml" }; + } + + /* + * (non-Javadoc) + * @see org.springframework.test.AbstractTransactionalSpringContextTests#onSetUpInTransaction() + */ + protected void onSetUpInTransaction() throws Exception { + super.onSetUpInTransaction(); + reader = createItemReader(); + executionContext = new ExecutionContext(); + } + + + protected ItemReader createItemReader() throws Exception { + LocalSessionFactoryBean factoryBean = new LocalSessionFactoryBean(); + factoryBean.setDataSource(super.getJdbcTemplate().getDataSource()); + factoryBean.setMappingLocations(new Resource[] { new ClassPathResource("Foo.hbm.xml", getClass()) }); + factoryBean.afterPropertiesSet(); + + SessionFactory sessionFactory = (SessionFactory) factoryBean.getObject(); + + String hsqlQuery = "select f.value, f.name from Foo f"; + + HibernateCursorItemReader inputSource = new HibernateCursorItemReader(); + inputSource.setQueryString(hsqlQuery); + inputSource.setSessionFactory(sessionFactory); + inputSource.afterPropertiesSet(); + inputSource.setSaveState(true); + + return inputSource; + } + + public void testNormalProcessing() throws Exception { + ((InitializingBean) reader).afterPropertiesSet(); + Object[] foo1 = (Object[]) reader.read(); + assertEquals(new Integer(1), foo1[0]); + } + +}