【问题标题】:Can we delete records in batches without their respective ids in spring boot我们可以在spring boot中批量删除没有各自id的记录吗
【发布时间】:2021-02-08 06:04:51
【问题描述】:

我是 Spring Boot 的新手,目前正在从事一个项目,我想在不考虑它们各自 ID 的情况下批量删除记录。我创建了名为domain_stats 的下表。

CREATE TABLE `domain_stats` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `domain` varchar(255) NOT NULL,
  `device_name` varchar(255) NOT NULL,
  `no_of_visits` int(4) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `domainDeviceVisits` (`domain`,`device_name`,`no_of_visits`)
);

我想使用 spring boot 批量删除 domain_stats 表的记录,但是批次应该由包含 domain、device_name 和 no_of_visits 列的值的记录列表组成,但不会考虑 id 值。此外,我们有域、设备名称和 no_of_visits 的唯一键。

域统计实体类

@Setter
@Getter
@ToString
@Entity
@Table(name="domain_stats")
public class DomainStats {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "domain", columnDefinition = "varchar(255)", nullable = false)
    private String domain;

    @Column(name = "device_name", columnDefinition = "varchar(255)", nullable = false)
    private String deviceName;

    @Column(name = "no_of_visits", columnDefinition = "int(4)", nullable = false)
    private Integer noOfVisits;

}

DomainStatsRepository


@Repository
public interface DomainStatsRepository extends JpaRepository<DomainStats,Long>{
   
}

DomainStatsDTO

@Getter
@Setter
public class DomainStatsDTO {
    private String domain;
    private String deviceName;
    private Integer noOfVisits;
}

删除统计控制器

@RestController
public class DeleteStatsController {
    
    @Autowired
    private DomainStatsRepository domainStatsRepository;

    @DeleteMapping("/delete")
    public String deleteStats(@RequestBody List<DomainStatsDTO> domainStatsDTOs){
        List<DomainStats> domainStats = domainStatsDTOs.stream()
            .map(req -> {
                DomainStats dStats = new DomainStats();
                dStats.setDomain(req.getDomain());
                dStats.setDeviceName(req.getDeviceName());
                dStats.setNoOfVisits(req.getNoOfVisits());
                return dStats;
            })
            .collect(Collectors.toList());
        domainStatsRepository.deleteInBatch(domainStats);
        return "Deleted Successfully";
    }
}

当我们调用 /delete api 并带有以下 json body 时,它应该批量记录所有记录,而不获取与记录相关的 id。

[
    {
        "domain":"cnn.com",
        "deviceName":"Mobile",
        "noOfVisits":100
    },
    {
       "domain":"fb.com",
        "deviceName":"Desktop",
        "noOfVisits":100
    }
]

【问题讨论】:

  • 您可以使用DELETE FROM ... WHERE id in :ids) 创建一个@Query。我认为它会获取 ID 以便在会话中拥有实体。
  • 乍一看,我认为首先你必须在表格注释中替换这一行。 @Table( uniqueConstraints= @UniqueConstraint(columnNames={"domain", "string", "device_name", "string", "no_of_visits", "number"}) )

标签: mysql spring-boot spring-data-jpa


【解决方案1】:

是的,您可以在 @Query 注释中使用 delete 查询。

但由于在这种情况下您似乎没有真正使用 JPA,我会考虑在抽象堆栈中退一步,并通过 JdbcTemplate 直接使用 JDBC

【讨论】:

    猜你喜欢
    • 2021-12-20
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    • 2021-12-30
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多