Spring Transactional不使用相同的JDBC连接

时间:2015-07-16 20:19:04

标签: java spring

有人可以告诉我为什么即使我在同一个交易下运行两个查询,我的sql也会获得“无效对象#EMP_TEMP”的异常?

@Transactional
public Map<String, EventType> findEventsByDateRange(final Date startTimestamp, final Date endTimestamp) throws Exception {
    log.debug("Fetching Events Data");
    String EVENT_QUERY = "Select ID, Name, Status, JoinDate into #EMP_TEMP from EMPLOYEE where JoinDate >= ? and JoinDate < ?";

    this.jt.execute(EVENT_QUERY, new PreparedStatementCallback<Boolean>() {
        @Override
        public Boolean doInPreparedStatement(PreparedStatement preparedStatement) throws SQLException, DataAccessException {
            preparedStatement.setTimestamp(1, new java.sql.Timestamp(startTimestamp.getTime()));
            preparedStatement.setTimestamp(2, new java.sql.Timestamp(endTimestamp.getTime()));
            return preparedStatement.execute();
        }
    });
    //this.jt.execute(EVENT_QUERY);

    return this.jt.query("SELECT * from #EMP_TEMP "
            , DataExtractor.eventDataExtractor);
}

但是,如果我更改下面的代码,那么它不会投诉。但这种方法的问题是我无法将任何参数传递给第一个查询:

@Transactional
public Map<String, EventType> findEventsByDateRange(final Date startTimestamp, final Date endTimestamp) throws Exception {
    log.debug("Fetching Events Data");
    String EVENT_QUERY = "Select ID, Name, Status, JoinDate into #EMP_TEMP from EMPLOYEE where JoinDate >= '2015-07-13 00:00:00.000' and JoinDate < '2015-07-14 00:00:00.000'";

    /*this.jt.execute(EVENT_QUERY, new PreparedStatementCallback<Boolean>() {
        @Override
        public Boolean doInPreparedStatement(PreparedStatement preparedStatement) throws SQLException, DataAccessException {
            preparedStatement.setTimestamp(1, new java.sql.Timestamp(startTimestamp.getTime()));
            preparedStatement.setTimestamp(2, new java.sql.Timestamp(endTimestamp.getTime()));
            return preparedStatement.execute();
        }
    });*/
    this.jt.execute(EVENT_QUERY);

    return this.jt.query("SELECT * from #EMP_TEMP "
            , DataExtractor.eventDataExtractor);
}

1 个答案:

答案 0 :(得分:0)

最后我发现问题的根本原因不是spring而是sql server。

在SQL Server 2005,SQL Server 2000和SQL Server 7.0中,预准备语句不能用于创建临时对象,也不能引用创建临时对象的系统存储过程,例如临时表。这些程序必须直接执行。

因为我试图通过jdbcTemplate方法创建临时表execute(String sql,PreparedStatementCallback action),它使用预处理语句,因此它无法正常工作。

而不是当我使用execute(String sql)创建临时表时,它正在工作。