我使用spring-batch
和JpaPagingItemReader<T>
将数据库读取到@Entity
。
实体被正确指定为类型参数T
。
问题:返回的结果集不是T
类型,而是一个对象数组:Object[]
。该数组本身中的每个对象都是Object[]
数组,其中包含以下内容:[firstname, lastname, date]
。
因此,数据库列以某种方式写成String数组,实体显然返回为String[]
数组。
原因是我的查询:
SELECT firstname, lastname, min(date) FROM mytable GROUP BY firstname, lastname;
所以读者映射到一个字符串数组。如何映射到@Entity
,可能只填充了select中请求的字段?
我的读者定义:
JpaPagingItemReader<MyEntity> reader = new JpaPagingItemReader<>();
reader.setEntityManagerFactory(emf);
reader.setQueryString(QUERY);
@Entity
public class MyEntity {
private String firstname, lastname;
private Date date;
public MyEntity(String firstname, String lastname, Date date) {
this.firstname = firstname;
this.lastname = lastname;
this.date = date;
}
}
答案 0 :(得分:1)
试试这个
SELECT m FROM mytable m GROUP BY m.firstname, m.lastname;
这应该返回您的实体
以下是定义读者的声明方式示例:
<beans:bean id="myreader"
class="org.springframework.batch.item.database.JpaPagingItemReader">
<beans:property name="queryString"
value="SELECT m FROM mytable m GROUP BY m.firstname, m.lastname" />
<beans:property name="entityManagerFactory" ref="entityManagerFactory" />
</beans:bean>
修改强>:
从M.Deinum的评论中,你应该可以使用它:
SELECT new com.myproject.model.MyEntity(firstname, lastname, min(date)) FROM mytable GROUP BY firstname, lastname