【问题标题】:JpaPagingItemReader not creating entity objectsJpaPagingItemReader 不创建实体对象
【发布时间】:2014-11-12 12:20:56
【问题描述】:

我正在使用spring-batchJpaPagingItemReader<T> 将数据库读取到@Entity。 实体被正确指定为类型参数T

问题:返回的结果集类型不是T,而是一个对象数组:Object[]。该数组本身中的每个对象都是一个 Object[] 数组,具有以下内容:[firstname, lastname, date]

因此,数据库列以某种方式编写为字符串数组,而实体显然返回为String[] 数组。

原因是我的查询:

SELECT firstname, lastname, min(date) FROM mytable GROUP BY firstname, lastname;

所以读取器映射到一个字符串数组。我怎样才能映射到我的@Entity,可能只填充选择中请求的字段?

我的读者定义:

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

【问题讨论】:

  • 你能展示你的 bean reader 定义吗?
  • 抱歉忘了添加我的查询,这可能是原因...
  • 这不是将 JPQL 与 JpaPagingItemReader 一起使用吗?添加了上面的阅读器定义。来自文档:It executes the JPQL {@link #setQueryString(String)} to retrieve requested * data.
  • 我认为,如果您想保持查询不变但又想返回一个对象,则必须创建一个 POJO,其构造函数接受 (String, String, Date) (但不会你的实体)。
  • 嗯好吧,这不是我想要的。如何重写查询以使其返回实体?

标签: java spring jpa spring-batch


【解决方案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

【讨论】:

  • 错误:Column m.* must occur in GROUP-BY clause or used in an aggregate function(来自母语输出的免费翻译。
  • 太棒了!新的运营商确实有效。这是正确的做事方式吗?
  • 如果您想返回实体的子集,可以。但是由于您的实体中只有 3 个属性,这很好。如果您的实体中有 20 个属性并且您只需要返回几个,您最好使用新的 POJO - 请参阅 stackoverflow.com/questions/2355728/…
猜你喜欢
  • 2011-08-09
  • 2021-06-24
  • 1970-01-01
  • 2011-12-22
  • 2020-02-14
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
相关资源
最近更新 更多