【问题标题】:postgresql Not In clause using batch updatepostgresql Not In 子句使用批量更新
【发布时间】:2019-05-19 10:42:08
【问题描述】:

我需要的是一个查询来删除除我指定的 ID 之外的所有 ID。因此我在春天有这样一个查询:

private final String SQL_Clear_Deleted_Options = "DELETE FROM vote_votes WHERE poll_id=? AND option_id <> ?";

我正在使用 jdbcTemplate 和 batchUpdate 来执行此操作。我还使用 运算符来表示 NOT IN 子句。这是我的代码:

public void clearDeletedOptions(int id) {
        int[] argTypes = { Types.INTEGER, Types.INTEGER };

        List<Object[]> batchArgs = new ArrayList<>();
        for (int i:ids) {
            batchArgs.add(new Object[]{id, i});
        }
        jdbcTemplate.batchUpdate(SQL_Clear_Deleted_Options, batchArgs, argTypes);
}

在上面的代码中,ids 是一个整数列表,表示查询中的 option_id 。 我想知道为什么它会相反并删除所有给定的ID!每件事看起来都很好,batchArges 包含对 (poll_id,option_id) 指示不应删除的特定 poll_id 和 option_ids。

有什么问题?

【问题讨论】:

    标签: spring jdbctemplate notin


    【解决方案1】:

    这是因为,每个不等于都会删除其余的记录。一种解决方案是通过动态创建sql来使用jdbcTemplate.execute

    import java.util.Arrays;
    import java.util.List;
    import java.util.stream.Collectors;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.jdbc.core.JdbcTemplate;
    
    @SpringBootApplication
    public class Application implements CommandLineRunner {
    
        private static final Logger log = LoggerFactory.getLogger(Application.class);
    
        public static void main(final String args[]) {
            SpringApplication.run(Application.class, args);
        }
    
        @Autowired
        JdbcTemplate jdbcTemplate;
    
        @Override
        public void run(final String... strings) throws Exception {
    
            log.info("Creating tables");
    
            jdbcTemplate.execute("DROP TABLE votes IF EXISTS");
            jdbcTemplate.execute("CREATE TABLE votes(id SERIAL, poll_id integer, option_id integer)");
    
            final List<Object[]> splitUpValues = Arrays.asList("1 0", "1 1", "2 2", "1 3", "1 4").stream()
                    .map(name -> name.split(" ")).collect(Collectors.toList());
    
            splitUpValues.forEach(name -> log.info(String.format("Inserting votes record for %d %d",
                    Integer.valueOf((String) name[0]), Integer.valueOf((String) name[1]))));
    
            jdbcTemplate.batchUpdate("INSERT INTO votes(poll_id, option_id) VALUES (?,?)", splitUpValues);
    
            log.info("Querying for all votes");
            jdbcTemplate
                    .query("SELECT id, poll_id, option_id FROM votes",
                            (rs, rowNum) -> new Votes(rs.getLong("id"), rs.getInt("poll_id"), rs.getInt("option_id")))
                    .forEach(vote -> log.info(vote.toString()));
    
            jdbcTemplate.execute("DELETE FROM votes WHERE poll_id = 1 AND option_id not in (1, 3)");
    
            log.info("Querying for all votes after batch delete");
            jdbcTemplate
                    .query("SELECT id, poll_id, option_id FROM votes",
                            (rs, rowNum) -> new Votes(rs.getLong("id"), rs.getInt("poll_id"), rs.getInt("option_id")))
                    .forEach(vote -> log.info(vote.toString()));
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 2016-10-28
      • 1970-01-01
      • 2019-08-10
      • 2011-01-12
      相关资源
      最近更新 更多