【发布时间】: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