【问题标题】:How to skip the update query execution IN Hibernate after criteria select如何在条件选择后跳过更新查询执行IN Hibernate
【发布时间】:2016-05-23 16:53:38
【问题描述】:

我在控制台中打印了一个 stange HQL。我没有在存储库中使用任何更新脚本。我正在通过 spring 的 Localsession factory builder 创建会话工厂和休眠会话。 我在选择条件后打印了一个更新查询。

 Criteria criteria = session
                .createCriteria(Test.class);
        criteria.add(Restrictions.eq("testKey.fode",
                airlineCode));
        criteria.add(Restrictions.eq(
                "testKey.number",eId));
        criteria.createAlias("currentMonth", "requiredMonth");
        criteria.add(Restrictions.eq("requiredMonth.type",
                currentMonthType));
        statusList = criteria.list(); 

在上面的criteria.list() 中工作正常,但是在更新查询后,表中的大多数列都被打印出来了?象征。如下所示

update STATUS set CUR_BASE=?, CUR_TYPE=?, CUR_GRP=?, CUR_TOM=?, CHECK_MON=? where FODE=? and CURRENTMONTH=? and E_NUM=?.

我想知道有什么办法可以跳过更新查询的执行。

我的持久化配置:

@Configuration
@EnableTransactionManagement
@PropertySource({ "classpath:persistence.properties" })
@ComponentScan({ "com.test.test2.*" })
public class PersistenceConfiguration1 {

    @Autowired
    private Environment env;

    @Bean(name="dsession")
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(testDataSource());
        sessionFactory.setPackagesToScan(new String[] {
                " com.test.test2"});

        return sessionFactory;
    }

    @Bean
    public DataSource testDataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
        dataSource.setUrl(env.getProperty("jdbc.url"));
        dataSource.setUsername(env.getProperty("jdbc.user"));
        dataSource.setPassword(env.getProperty("jdbc.pass"));

        return dataSource;
    }

    @Bean(name="dTransaction")
    @Autowired
    public HibernateTransactionManager transactionManager(
            SessionFactory sessionFactory) {
        HibernateTransactionManager txManager = new HibernateTransactionManager();
        txManager.setSessionFactory(sessionFactory);

        return txManager;
    }
}

【问题讨论】:

  • 提供完整的 DAO 类(代码)。 Hibernate 不会突然生成 HQL,您的代码中可能会执行更新(事务流)。
  • Hibernate 在执行查询之前刷新所有待处理的数据库更改,以确保数据对于当前事务是一致的。如果禁用此功能,您可能会遇到当前事务的不一致数据。

标签: java spring oracle hibernate


【解决方案1】:

我在代码中发现了问题。感谢@K139 指点我分析路径。

Criteria.list() 之后,我在 DB 的返回列表中设置了一些值

   statusList = criteria.list();
  status = statusList.get(0);\
status.setFode(status.getFode.trim)

我将修剪功能从存储库移动到其他层,现在它工作正常。 谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-08
    • 2020-08-29
    • 2012-09-26
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    相关资源
    最近更新 更多