【问题标题】:HibernatePagingItemReader throwing QuerySyntaxException table is not mappedHibernatePagingItemReader 抛出 QuerySyntaxException 表未映射
【发布时间】:2017-08-28 05:46:04
【问题描述】:

我正在使用 spring-boot、spring-batch 应用程序进行开发,我正在使用 HibernatePagingItemReader 从源表中读取数据。当我运行代码时,我遇到了异常。下面是我的应用程序代码。请注意,我在数据库中的表名是“OLDUSER”,我的实体名是“Olduser”。对于类似的问题,我已经使用了通过 stackoverflow 提出的所有可能的建议,但没有一个对我有用。 谢谢您的帮助。

    org.hibernate.hql.internal.ast.QuerySyntaxException: Olduser is not mapped [FROM Olduser o where o.id>=7501 and o.id <= 15000 order by o.id ASC]
at org.hibernate.hql.internal.ast.QuerySyntaxException.generateQueryException(QuerySyntaxException.java:79)
at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:103)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:218)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:142)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:115)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:76)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:150)

域类:Olduser.java:-

    import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Table(name="OLDUSER")
@Entity
public class Olduser {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="ID")
    int id;
    @Column(name="USERNAME")
    String username;
    @Column(name="PASSWORD")
    String password;
    @Column(name="AGE")
    int age;

    public Olduser(int id, String username, String password, int age) {
        super();
        this.id = id;
        this.username = username;
        this.password = password;
        this.age = age;
    }

ItemReader 代码:-

        @Bean
@StepScope
public HibernatePagingItemReader<Olduser> hibernateUserItemReader(
        @Value("#{stepExecutionContext[fromId]}") final String fromId,
        @Value("#{stepExecutionContext[toId]}") final String toId,
        @Value("#{stepExecutionContext[name]}") final String name) throws Exception {

    LocalSessionFactoryBean factoryBean = new LocalSessionFactoryBean();
    factoryBean.setDataSource(this.dataSource);
    factoryBean.afterPropertiesSet();
    SessionFactory sessionFactory = factoryBean.getObject();

    HibernatePagingItemReader<Olduser> hibernateReader=new HibernatePagingItemReader<>();
    hibernateReader.setFetchSize(chunkSize);
    hibernateReader.setQueryString("FROM Olduser o where o.id>=" + fromId + " and o.id <= " + toId +" order by o.id ASC");
    hibernateReader.setSessionFactory(sessionFactory);
    hibernateReader.setUseStatelessSession(false);
    hibernateReader.setSaveState(false);
    hibernateReader.afterPropertiesSet();
    return hibernateReader;
}

【问题讨论】:

  • 检查stackoverflow.com/questions/18629702/… 的答案是否适合您的问题
  • 嗨@LucaBassoRicci,感谢您的帮助,我已经找到了问题的解决方案。我已经添加了注释包,并且我必须添加bean JPATransactionManager 来管理LocalSessionFactoryBean 的事务。我现在将发布完整的解决方案。

标签: spring hibernate spring-boot spring-batch batch-processing


【解决方案1】:

我已经找到了上述问题的解决方案。我错过了在 LocalSessionFactoryBean 中添加注释包,这是上下文无法找到实体类的原因。我也错过了管理事务的事务管理器类。下面是代码sn-p。

创建了一个单独的 bean sessionFactory 并在 hibernatePagingItemReader 中添加了相同的内容

    hibernateReader.setSessionFactory(sessionFactory().getObject());

SessionFactory Bean:-

    @Bean
public LocalSessionFactoryBean sessionFactory() throws IOException{
    LocalSessionFactoryBean factoryBean = new LocalSessionFactoryBean();
    factoryBean.setDataSource(this.dataSource);
    factoryBean.setPackagesToScan("package name");
    factoryBean.afterPropertiesSet();
    return factoryBean;
}

TransactionManager bean:-

     @Bean
public JpaTransactionManager transactionManager() {
    return new JpaTransactionManager();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 2014-03-04
    • 2021-03-10
    相关资源
    最近更新 更多